转载:配置nginx支持pathinfo功能

时间:2022-10-18 09:18:47

原文地址:http://linuxguest.blog.51cto.com/195664/694319

 

nginx模式不支持pathinfo模式,类似info.php/hello形式的url会被提示找不到页面。下面的通过正则找出实际文件路径和pathinfo部分的方法,让nginx支持pathinfo。

 

nginx虚拟主机配置文件:

server {
listen
80;
server_name localhost
;
root
/data/site;

# 要实现使用指定程序处理 /a/b/c 路径请求,需要将请求地址改写为 /index.php/a/b/c;
# 如果请求路径是物理存在的则不进行改写,防止将 /index.php 请求也改写了;
if ( !-e $request_filename ) {
rewrite ^
/(.*)$ /index.php/$1 break;
}

# ~ \.php 后面不能有$,以便能匹配所有 *.php/* 形式的url
location ~
\.php {
include fcgi_pathinfo
.conf;
fastcgi_pass
127.0.0.1:9000;
}
}

 

在 fcgi_pathinfo.conf 中更改 SCRIPT_FILENAME:

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;
## 以上是支持pathinfo的重点部分

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;

 

在PHP程序中获取path_info:

// 获取 PATH_INFO
$path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
preg_replace('/\.\./', '', $path_info);

$path_array = array();
if (preg_match_all('/([^\/]+)/', $path_info, $temp)) {
$path_array = $temp[1];
}