NGINX处理$_GET查询参数的方式与Apache不同

qco9c6ql  于 2023-02-19  发布在  Apache
关注(0)|答案(1)|浏览(107)

我目前正在从包含以下.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.
}
ijnw1ujt

ijnw1ujt1#

我设法解决了我的问题与以下:

location / { 
    try_files $uri $uri/ /index.php?$is_args$args;
    if (!-e $request_filename) {
        rewrite ^/(.*)$ /index.php?req=$1 last;
    }
}

这将防止非请求文件名的重写。

相关问题