从Apache迁移至Azure环境的NGINX后,Query String无法传递到$_GET的问题求助
从Apache迁移至Azure环境的NGINX后,Query String无法传递到$_GET的问题求助
看起来你在把Apache环境的WebApp迁移到Azure的NGINX时遇到了路由和Query String传递的问题,我来帮你分析一下可能的根源和解决办法。
先梳理下你的核心问题:
- 当访问
https://group?page=2时,$_GET['page']能正常拿到值 - 但访问多级路径的URL比如
https://group/body/body_inc?page=2时,无法获取到$_GET['page'],路由流程也没按预期走
核心问题:Root目录配置错误
从你的目录结构和NGINX配置来看,第一个关键问题是root路径设置不对:
你的index.php、group.php这些核心入口文件都在/home/site/wwwroot/目录下,但你NGINX里的root却指向了/home/site/wwwroot/public。这就导致当NGINX尝试执行/index.php时,它实际找的是/home/site/wwwroot/public/index.php——但这个文件根本不存在!直接导致路由逻辑完全走偏了。
修正后的NGINX配置调整方案
我帮你重新调整配置,重点解决root路径和路由规则的问题,同时保证Query String正确传递:
1. 修正Root目录
把root从/home/site/wwwroot/public改成/home/site/wwwroot,因为你的核心PHP入口都在这个目录下。
2. 单独处理静态资源
给public/目录单独设置location,避免静态资源被错误路由到index.php。
3. 确保参数正确传递
保留try_files逻辑,同时用$is_args$args实现Apache原规则里的QSA(Query String Append)效果。
以下是修改后的关键配置片段:
# 修正Root目录,指向包含index.php的WebApp根目录 root /home/site/wwwroot; # 处理public目录下的静态资源,直接返回不经过路由 location /public/ { try_files $uri $uri/ =404; charset UTF-8; } location / { index index.php; # 路由规则:非文件/目录的请求转发到index.php,同时传递完整路径和Query String try_files $uri $uri/ /index.php?url=$uri$is_args$args; charset UTF-8; fastcgi_param REQUEST_ID $request_id; proxy_cookie_path / "/; secure; HttpOnly; SameSite=strict"; client_max_body_size 100M; } # PHP处理块调整,确保指向正确的PHP文件 location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(|/.*)$; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param HTTP_PROXY ""; # 用正确的root路径拼接脚本名,指向实际存在的PHP文件 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; # 确保Query String完整传递给PHP fastcgi_param QUERY_STRING $query_string; fastcgi_intercept_errors on; fastcgi_connect_timeout 300; fastcgi_send_timeout 3600; fastcgi_read_timeout 3600; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_hide_header X-Powered-By; fastcgi_hide_header X-CF-Powered-By; }
为什么原来的配置不行?
- Root路径错误导致NGINX找不到正确的
index.php,请求处理流程完全偏离预期 - 虽然你在
try_files里加了$is_args$args,但因为Root错误,参数无法正确传递到你的路由逻辑中
额外注意点
- 尽量避免用
if (!-e $request_filename)这类写法,NGINX的if存在很多场景陷阱,try_files是更安全的路由替代方案 - 你的Apache原规则用了
QSA,NGINX里的$is_args$args就对应这个功能,能把原URL的Query String完整追加到新请求里 - 确认Azure环境中PHP-FPM的监听地址是
127.0.0.1:9000,如果端口不同需要调整fastcgi_pass的配置
你可以先试试调整Root目录和上述配置,应该能解决多级路径下的参数传递问题。
备注:内容来源于stack exchange,提问作者Lukáš Fadrhons
相关产品推荐
相关产品推荐

