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