我目前正在使用 Vagrant 设置一台机器进行本地开发。一切运行正常,只是查询参数不会在子页面上传递给 PHP。
这意味着在 上www.example.com/?a=b
,查询参数是可访问的,但在 上www.example.com/subpage/?a=b
则不可以。
我用 Google 找到的解决这个问题的一般方法是修改指令try_files
,但这对我来说不起作用。我还检查了request_order
& variables_order
in php.ini
– 那里的一切都设置正确。
这是我的配置:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/public;
location / {
index index.html index.htm index.php;
try_files $uri $uri/ /index.php?$query_string;
include /etc/nginx/fastcgi_params;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include /etc/nginx/fastcgi_params;
}
sendfile off;
}
由于我不太了解服务器设置和管理,所以我在这里遇到了困难,但我仍然检查了以下几件事:
$query_string
设置/etc/nginx/fastcgi_params
为fastcgi_param QUERY_STRING $query_string;
对我来说似乎正确。- 路径
fastcgi_params
是正确的
由于它在不在子页面上时也能工作,我现在怀疑位置块不匹配,但我真的不明白怎么会这样 - 请帮忙。
答案1
您需要使用 $is_args 作为问号,$args 或使用 $query_string 作为问号之后的查询字符串。
这是最后一个组合。
try_files $uri $uri/ /index.php$is_args$query_string;
还要确保你已经设置
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
然后将其传递给 fastcgi;
fastcgi_pass 127.0.0.1:9000;
答案2
查询字符串以问号开头。
然后在第二个块中设置:
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
由于这里没有任何指令,因此请在第一个块中删除fastcgi_pass
。