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;
}


Related articles: