nginx配置支持php的pathinfo模式配置方法
nginx模式不支持pathinfo模式,类似info.php/hello形式的url会被提示找不到页面。下面的通过正则找出实际文件路径和pathinfo部分的方法,让nginx支持pathinfo。
location~\.php${
roothtml;
fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.php;
##通过设置模拟出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_paramSCRIPT_FILENAME$document_root$real_script_name;
fastcgi_paramSCRIPT_NAME$real_script_name;
fastcgi_paramPATH_INFO$path_info;
includefastcgi_params;
}
要点:
1.~\.php后面不能有$ 以便能匹配所有*.php/*形式的url
2.通过设置更改SCRIPT_FILENAME
我在实际使用张将这段代码融合到了fastcgi_params中。下面是我的nginx配置文件示例:
配置虚拟主机部分,支持pathinfo的nginx代码如下:
##在nginx.conf的server部分:
server{
listen8080;
server_namelocalhost;
location~\.php{
includefastcgi.conf;
}
}
##要点:\.php后面没有$,以便匹配所有*.php/*形式
##重点代码见fastcgi.conf开头部分
fastcgi.conf代码如下:
fastcgi_pass127.0.0.1:9000;
##fastcgi_indexindex.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_paramSCRIPT_FILENAME$document_root$real_script_name;
fastcgi_paramSCRIPT_NAME$real_script_name;
fastcgi_paramPATH_INFO$path_info;
##以上是支持pathinfo的重点部分
fastcgi_paramGATEWAY_INTERFACECGI/1.1;
fastcgi_paramSERVER_SOFTWAREnginx;
fastcgi_paramQUERY_STRING$query_string;
fastcgi_paramREQUEST_METHOD$request_method;
fastcgi_paramCONTENT_TYPE$content_type;
fastcgi_paramCONTENT_LENGTH$content_length;
#fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;
#fastcgi_paramSCRIPT_NAME$fastcgi_script_name;
fastcgi_paramREQUEST_URI$request_uri;
fastcgi_paramDOCUMENT_URI$document_uri;
fastcgi_paramDOCUMENT_ROOT$document_root;
fastcgi_paramSERVER_PROTOCOL$server_protocol;
fastcgi_paramREMOTE_ADDR$remote_addr;
fastcgi_paramREMOTE_PORT$remote_port;
fastcgi_paramSERVER_ADDR$server_addr;
fastcgi_paramSERVER_PORT$server_port;
fastcgi_paramSERVER_NAME$server_name;
#PHPonly,requiredifPHPwasbuiltwith--enable-force-cgi-redirect
#fastcgi_paramREDIRECT_STATUS200;
自己的配置:
server
{
listen80;
server_namewww.touchopenid.com;
indexindex.htmlindex.htmindex.php;
root/data0/htdocs/openid;
location~\.php($|/){
set$script$uri;
set$path_info"";
if($uri~"^(.+\.php)(/.+)"){
set$script$1;
set$path_info$2;
}
fastcgi_pass127.0.0.1:9000;
includefastcgi_params;
fastcgi_paramPATH_INFO$path_info;
fastcgi_paramSCRIPT_FILENAME$document_root$script;
fastcgi_paramSCRIPT_NAME$script;
}