我目前正在从包含以下.htaccess规则的Apache构建版本迁移一个网站:
<ifmodule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^$ index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|admin|captcha|print|pdf\.php|robots\.txt)
RewriteRule (.*) index.php?req=$1 [QSA,L]
</ifmodule>
我已经设置了NGINX并添加了以下位置块:
location / {
try_files $uri /index.php?req=$uri$is_args$args;
}
这适用于大多数页面,但是一些处理查询字符串的内部页面失败了。经过一些调试,我发现转储$_GET
返回不同的结果。Apache服务器返回:
array(2) { ["req"]=> string(8) "checkout" ["quick"]=> string(23) "email@address.com" }
这对这个老网站来说非常有效,但是NGINX服务器返回了:
array(1) { ["req"]=> string(39) "/checkout?quick=email@address.com" }
有谁能帮我弄明白发生了什么事吗?似乎我传递req
以及其他查询参数时出现了问题。
**更新:**我已经设法通过以下NGINX设置部分解决了这个问题,但我不得不手动排除我不想重写的每个路径,这很烦人:
location / {
try_files $uri $uri/ /index.php?$is_args$args;
rewrite ^/(.*)$ /index.php?req=$1 last;
}
location /admin {
try_files $uri $uri/ /admin/index.php?$is_args$args;
}
location /js/ {
# Do nothing. nginx will serve files as usual.
}
location /css/ {
# Do nothing. nginx will serve files as usual.
}
location /images/ {
# Do nothing. nginx will serve files as usual.
}
1条答案
按热度按时间ijnw1ujt1#
我设法解决了我的问题与以下:
这将防止非请求文件名的重写。