我需要一个小手修复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上的QSA
mod_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/
直接指向这个目录。