Nginx & PHP-FPM: Query parameters won't be passed to PHP
You need to use $is_args for question mark & $args or $query_string for query string afterwards question mark.
here it's the last combination.
try_files $uri $uri/ /index.php$is_args$query_string;
Also be sure that you have set
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
then pass it fastcgi;
fastcgi_pass 127.0.0.1:9000;
Related videos on Youtube
Sven
Updated on September 18, 2022Comments
-
Sven almost 2 years
I am currently setting up a machine for local development using Vagrant. Everything runs as it should, expect query parameters aren't passed to PHP on subpages.
That means on
www.example.com/?a=b
, the query parameter is accessible, but onwww.example.com/subpage/?a=b
it's not.The general reply I found using Google for this problem is to modify the
try_files
directive, but that isn't working for me. I've also checked therequest_order
&variables_order
inphp.ini
– everything is setup correctly there.This is my config:
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; }
Since I don't know much about server setup & administration, I am hitting a brick wall here, still here are a few things I also checked:
$query_string
is set in/etc/nginx/fastcgi_params
asfastcgi_param QUERY_STRING $query_string;
which seems correct to me.- The path to
fastcgi_params
is correct
Since it works when not being on a subpage, I am now suspecting the location blocks not matching, but I really don't understand how this could be the case – please help.
-
Dalibor Karlović about 9 yearsIt's a long shot, but make sure you're not being redirected before you handle the request. You can easily see this in Chrome's DevTools Network tab, use Preserve log.
-
Sven about 9 years@DaliborKarlović Thanks for the suggestion – I checked & I am not being redirected.
-
Pothi Kalimuthu about 9 yearsTurning on debugging and watching the log would help. nginx.org/en/docs/debugging_log.html . Most distributions come with debugging pre-compiled.
-
elif over 8 yearsCould you make this work? @Sven
-
Sven about 9 yearsDo I need to put this in both location blocks?
-
Xavier Lucas about 9 years@Sven Why would you put this in the first block ? There's no
fastcgi_pass
directive here. -
risyasin about 9 yearscheck for $is_args in documentation. nginx.org/en/docs/http/ngx_http_core_module.html
-
Sven about 9 yearsOkay I see. Unfortunately, it still doesn't work. Is the order of the directives in the location block important?
-
Xavier Lucas about 9 years@Sven No it's not except if your include directive override a previous configuration line using the same directive. Can you clarify the it doesn't work ? This really seems to come from your app. Also make sure you are not hitting browser cache when testing.
-
Sven about 9 yearsOkay, thanks. For clarification:
_SERVER["QUERY_STRING"]
is still empty on a subpage with query parameters present (example.com/subpage/?a=b
). Onexample.com?a=b
the query string is present in_SERVER["QUERY_STRING"]
. Do I need to do something else that reloading Nginx for changes to take effect? -
Sven about 9 yearsCool, I think I understand. Still, query string are not present on subpages.
-
Xavier Lucas about 9 years@Sven Nothing else than reloading is required.
-
Sven about 9 yearsThen it's exactly setup according to your answer, but not working, sorry.
-
Francisco over 7 yearsMan,
$is_args$query_string
saved my life for a query parameters in pages. Thanks a lot.