如何使用nginx和php后端修复重定向到尾部斜杠

如何使用nginx和php后端修复重定向到尾部斜杠,nginx,fastcgi,nginx-location,php-7.2,Nginx,Fastcgi,Nginx Location,Php 7.2,像这样,我遇到了同样的问题,尾部斜杠 目录/var/www/services包含几个后端服务。 例如,我请求GET/customer?arg1=1&arg2=2nginx将始终将我重定向到/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

像这样,我遇到了同样的问题,尾部斜杠

目录/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;
}
服务器{
听80;
听443ssl;
服务器名称api.local;
root/var/www/services;
ssl_certificate/etc/ssl/certs/optimax.crt;
ssl\u certificate\u key/etc/ssl/certs/optimax.key;
ssl_dhparam/etc/ssl/certs/optimax.pem;
位置~^/(?[^/]+)/(.*)${
root/var/www/services/$ms_dir/public;
设置$ms_请求$2;
try_files$uri/index.php$is_args$args;
}
位置~/index\.php(/|$){
fastcgi_pass php72:9001;
fastcgi\u split\u path\u info^(.+\.php)(/.+)$;
包括fastcgi_参数;
fastcgi_参数请求URI$ms_请求;
fastcgi_参数SCRIPT_FILENAME$realpath_root/$ms_dir/public$fastcgi_SCRIPT_name;
fastcgi_param DOCUMENT_ROOT$realpath_ROOT/$ms_dir/public;
}
访问日志/dev/stdout;
错误日志/dev/stderr;
重写你的登录;
}
这个建议非常有效

更新配置如下:

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;
}
服务器{
听80;
听443ssl;
服务器名称api.local;
root/var/www/services;
ssl_certificate/etc/ssl/certs/optimax.crt;
ssl\u certificate\u key/etc/ssl/certs/optimax.key;
ssl_dhparam/etc/ssl/certs/optimax.pem;
位置~/index\.php(/|$){
fastcgi_pass php72:9001;
fastcgi\u split\u path\u info^(.+\.php)(/.+)$;
包括fastcgi_参数;
fastcgi_参数请求URI$ms_请求;
fastcgi_参数SCRIPT_FILENAME$realpath_root/$ms_dir/public$fastcgi_SCRIPT_name;
fastcgi_param DOCUMENT_ROOT$realpath_ROOT/$ms_dir/public;
}
位置~^/(?[^/]+)(?:/(.*))${
root/var/www/services/$ms_dir/public;
设置$ms_请求$2;
try_files$uri/index.php$is_args$args;
}
访问日志/dev/stdout;
错误日志/dev/stderr;
重写你的登录;
}

/var/www/services
目录中是否有一个名为
customer
的目录?是的,在
/var/www/services
目录中有一个
customer
目录,它包含一个带有index.php文件的
public
目录重定向是默认行为。但问题的根本原因是正则表达式与
/customer
不匹配。您可以尝试:
^/(?[^/]+)(?:/(.*)?$
现在我得到重写周期,所有其他请求得到500响应
重写或内部重定向周期,同时内部重定向到“/index.php”,客户端:172.18.0.6,服务器:api.local,请求:“POST/customer/token HTTP/1.1”,主机:“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”
请您解释一下表达式的第二部分,我一点也弄不明白。您应该反转两个正则表达式位置块。