【问题标题】:How to fix redirect to trailing slash with nginx and php backend如何使用 nginx 和 php 后端修复重定向到斜杠
【发布时间】:2019-10-15 05:48:48
【问题描述】:

就像在这个thread 中一样,我在尾部斜杠上遇到了同样的问题。

目录 /var/www/services 包含多个后端服务。 例如,我请求 GET /customer?arg1=1&arg2=2 nginx 将始终将我重定向到 /customer/?arg1=1&arg2=2

Nginx 日志输出:

172.18.0.6 - - [29/May/2019:14:47:32 +0000] "GET /customer?limit=1&filter%5Bemail%5D=somemail%40gmail.com&filter%5BwebsiteId%5D=1 HTTP/1.1" 301 170 "-" "GuzzleHttp/6.3.3 curl/7.29.0 PHP/7.0.33"
172.18.0.6 - - [29/May/2019:14:47:32 +0000] "GET /customer/?limit=1&filter%5Bemail%5D=somemail%40gmail.com&filter%5BwebsiteId%5D=1 HTTP/1.1" 200 12 "-" "GuzzleHttp/6.3.3 curl/7.29.0 PHP/7.0.33"

所有其他请求,例如 customer/count 都按预期工作。

如何避免这种不良行为?

配置如下:

server {
        listen 80;
        listen 443 ssl;
        server_name api.local;
        root /var/www/services;

        ssl_certificate  /etc/ssl/certs/optimax.crt;
        ssl_certificate_key /etc/ssl/certs/optimax.key;
        ssl_dhparam /etc/ssl/certs/optimax.pem;

        location ~ ^/(?<ms_dir>[^/]+)/(.*)$ {
                root /var/www/services/$ms_dir/public;
                set $ms_request $2;
                try_files $uri /index.php$is_args$args;
        }

        location ~ /index\.php(/|$) {
                fastcgi_pass php72:9001;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                include fastcgi_params;
                fastcgi_param REQUEST_URI $ms_request;
                fastcgi_param SCRIPT_FILENAME $realpath_root/$ms_dir/public$fastcgi_script_name;
                fastcgi_param DOCUMENT_ROOT $realpath_root/$ms_dir/public;
        }

        access_log /dev/stdout;
        error_log /dev/stderr;
        rewrite_log on;
}

【问题讨论】:

  • /var/www/services目录下是否有一个叫customer的目录?
  • 是的,/var/www/services 中有一个customer 目录,它包含一个带有 index.php 文件的public 目录
  • 重定向是默认行为。但是你的问题的根本原因是正则表达式不匹配/customer。你可以试试:^/(?&lt;ms_dir&gt;[^/]+)(?:/(.*))?$
  • 现在我得到了重写周期,所有其他请求得到 500 响应 rewrite or internal redirection cycle while internally redirecting to "/index.php", client: 172.18.0.6, server: api.local, request: "POST /customer/token HTTP/1.1", host: "api.local" 172.18.0.6 - 592bec74-cfa6-48b1-a7da-be765652274c [30/May/2019:07:38:53 +0000] "POST /customer/token HTTP/1.1" 500 178 "-" "GuzzleHttp/6.3.3 curl/7.29.0 PHP/7.0.33" 你能解释一下表达式的第二部分吗,我有点想不通。
  • 你应该反转两个正则表达式位置块。

标签: nginx fastcgi nginx-location php-7.2


【解决方案1】:

Richard Smith's 建议非常有效。

以下更新配置:

server {
        listen 80;
        listen 443 ssl;
        server_name api.local;
        root /var/www/services;

        ssl_certificate  /etc/ssl/certs/optimax.crt;
        ssl_certificate_key /etc/ssl/certs/optimax.key;
        ssl_dhparam /etc/ssl/certs/optimax.pem;

        location ~ /index\.php(/|$) {
                fastcgi_pass php72:9001;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                include fastcgi_params;
                fastcgi_param REQUEST_URI $ms_request;
                fastcgi_param SCRIPT_FILENAME $realpath_root/$ms_dir/public$fastcgi_script_name;
                fastcgi_param DOCUMENT_ROOT $realpath_root/$ms_dir/public;
        }

        location ~ ^/(?<ms_dir>[^/]+)(?:/(.*))$ {
                root /var/www/services/$ms_dir/public;
                set $ms_request $2;
                try_files $uri /index.php$is_args$args;
        }

        access_log /dev/stdout;
        error_log /dev/stderr;
        rewrite_log on;
}

【讨论】:

    猜你喜欢
    • 2019-10-12
    • 2013-01-27
    • 1970-01-01
    • 2015-07-17
    • 2011-10-19
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多