nginx configuration supports php's pathinfo mode configuration method
- 2020-05-13 04:33:12
- OfStack
nginx mode does not support pathinfo mode, and url in the form of info.php /hello will be prompted that the page cannot be found. The following method is to find out the actual file path and pathinfo section by regularizing nginx to support pathinfo.
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
## Simulated by setting pathinfo
set $path_info "" ;
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ " ^(.+?\.php)(/.+)$ " ) {
set $real_script_name $1;
set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
include fastcgi_params;
}
Key points:
1.~ \.php cannot have $after it to match all url in the form *.php /*
2. Change SCRIPT_FILENAME by setting
I actually used zhang to merge this code into fastcgi_params. Here is an example of my nginx configuration file:
Configure the virtual host part. The nginx code supporting pathinfo is as follows:
In the server section of nginx.conf:
server {
listen 8080;
server_name localhost;
location ~ \.php {
include fastcgi.conf;
}
}
No $after.php to match all *.php /* forms
The key code is shown at the beginning of fastcgi.conf
fastcgi.conf code is as follows:
fastcgi_pass 127.0.0.1:9000;
##fastcgi_index index.php;
set $path_info "";
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
## So that's support pathinfo Key points
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param REDIRECT_STATUS 200;
My own configuration:
server
{
listen 80;
server_name www.touchopenid.com;
index index.html index.htm index.php;
root /data0/htdocs/openid;
location ~ \.php($|/) {
set $script $uri;
set $path_info "";
if ($uri ~ "^(.+\.php)(/.+)") {
set $script $1;
set $path_info $2;
}
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param PATH_INFO $path_info;
fastcgi_param SCRIPT_FILENAME $document_root$script;
fastcgi_param SCRIPT_NAME $script;
}