转换Apache重写规则(前端控制器)到Nginx



我需要一个小手修复Nginx的重写规则。

文件夹结构如下:

  • dev.example.com/public_html<<包含站点
<IfModule mod_rewrite.c>
Options -Multiviews
RewriteEngine On
RewriteBase /
RewriteRule ^$ public_html/ [L]
RewriteRule (.*) public_html/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule  ^(.+)$ index.php?url=$1 [QSA,L]
</IfModule>

我的Nginx配置是这样的…

root /data/wwwroot/domain.com/public_html;

include /usr/local/nginx/conf/rewrite/others.conf;
#error_page 404 /404.html;
#error_page 502 /502.html;

location ~ [^/].php(/|$) {
#fastcgi_pass remote_php_ip:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
expires 30d;
access_log off;
}
location ~ .*.(js|css)?$ {
expires 7d;
access_log off;
}
location ~ /(.user.ini|.ht|.git|.svn|.project|LICENSE|README.md) {
deny all;
}
location /.well-known {
allow all;
}

我有一些在线转换器,但正在努力使它运行。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ public_html/ [L]
RewriteRule (.*) public_html/$1 [L]
</IfModule>

第一个.htaccess文件(在public_html目录之上)在你的Nginx服务器上是不需要的,因为你已经配置了root直接指向public_html目录。

<IfModule mod_rewrite.c>
Options -Multiviews
RewriteEngine On
RewriteBase /
RewriteRule ^$ public_html/ [L]
RewriteRule (.*) public_html/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule  ^(.+)$ index.php?url=$1 [QSA,L]
</IfModule>

这个.htaccess文件(在/public_html目录中)没有意义。具体来说,前两个RewriteRule指令(它们重复父.htaccess文件中的指令)是错误的,应该删除。如果处理,则会导致重写循环(500 Internal Server Error)。

Options -MultiViews不适用于Nginx,因此可以忽略此规则。

所以,需要"转换"的相关指令

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule  ^(.+)$ index.php?url=$1 [QSA,L]

这是一个相对标准的"前置控制器"模式。但是,传递给index.php脚本的url参数值不包含斜杠前缀。在Nginx上精确地实现需要一个额外的步骤。通常,您只需传递包含斜杠前缀的URL,然后让脚本处理它。(尽管你真的不需要传递url路径,因为这可以从请求的url路径中解析——尽管它允许你"覆盖"。)请求的url路径

root指令之后,设置目录"索引";文档:

index index.php;

当请求文档根目录时需要(与Apache相同)。

在最后一个location块之后,为"front-controller"添加另一个块:

location ~ ^/(.+) {
try_files $uri $uri/ /index.php?url=$1$is_args$args;
}

$1反向引用指的是location报头中捕获的子模式-它包含url路径,减去斜杠前缀。

附加的$is_args$args是附加任何可能出现在初始请求中的附加查询字符串所必需的。(这相当于Apache上的QSAmod_rewrite标志)

但是,如果您同意在url参数中包含脚本url路径上的斜杠前缀,则上述内容可以"简化"。:

location / {
try_files $uri $uri/ /index.php?url=$uri$is_args$args;
}

但是请注意,这个版本与等价的Apache/.htaccess指令并不完全相同。


可选,将url路径作为PATH_INFO在index.php之后传递。


文件夹结构如下:

  • dev.example.com/public_html<<包含站点

注意,在你的Nginx配置中,public_html指令文档根目录,所以dev.example.com/直接指向这个目录。

相关内容

  • 没有找到相关文章

最新更新