如何使用nginx和php后端修复重定向到尾部斜杠
像这样,我遇到了同样的问题,尾部斜杠 目录/var/www/services包含几个后端服务。 例如,我请求GET如何使用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
/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”
请您解释一下表达式的第二部分,我一点也弄不明白。您应该反转两个正则表达式位置块。