多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
pathinfo模式是伪静态的一种:`http://www.xxx.com/index.php/模块/控制器/方法` pathinfo 模式 需要 php.ini 开启下面这个参数 ``` cgi.fix_pathinfo=1 ``` apache服务器本身是支持pathinfo的,通过简单修改几项配置即可。当配置支持pathinfo后,在php应用程序中,通过\_SERVER\['PATH\_INFO'\]变量获取pathinfo值为/topic/detail/tid/82.html。 我们就可以很容易通过php逻辑代码来解析出controller文件、action方法、以及剩余的动态参数,进而就可以返回正确的网页响应。 但是我们要说的**nginx服务器默认是不支持pathinfo模式访问**。实质上就是nginx不会去设置环境变量PATH\_INFO 的值,导致php应用程序不能通过\_SERVER\['PAHT\_INFO'\]来获取path\_info, 也就不能解析出对应的动态参数。 ## **nginx支持pathinfo的配置如下:** **1\. 找到ngingx的配置文件nginx.conf** 在server里的location项, **修改前为:** ~~~ location ~ \.php$ { #注:去掉本行的$ 字符 root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; #注:下面加上一些配置语句 } ~~~ **修改后为:** ~~~ location ~ \.php { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params;#这里可以新建一个文件include fcgi.conf;(fastcgi_paramsi.conf;??)专门保存fastcgi_param参数和值 #定义变量 $path_info ,用于存放pathinfo信息 set $path_info ""; #定义变量 $real_script_name,用于存放真实地址 set $real_script_name $fastcgi_script_name; #如果地址与引号内的正则表达式匹配 if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") { #将文件地址赋值给变量 $real_script_name set $real_script_name $1; #将文件地址后的参数赋值给变量 $path_info set $path_info $2; } #配置fastcgi的一些参数 fastcgi_param SCRIPT_NAME $real_script_name; fastcgi_param PATH_INFO $path_info; 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; } ~~~ **2.重启nginx和phpcgi** **其他参考:** thinkphp 框架比较好了支持了pathinfo模式访问,可以去深入了解一下它是怎么支持pathinfo格式的。 ## **配置2参考** ``` 典型默认配置 location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $DOCUMENT_ROOT$fastcgi_script_name; include fastcgi_params; } 修改后的配置 修改第1,6行,支持pathinfo location ~ \.php(.*)$ { # 正则匹配.php后的pathinfo部分($是引用参数 数字是第1~n个参数) root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $DOCUMENT_ROOT$fastcgi_script_name; fastcgi_param PATH_INFO $1; # 把pathinfo部分赋给PATH_INFO变量 include fastcgi_params; } ``` ## **配置3参考** ~~~ 典型默认配置 location / { #访问路径,可相对也可绝对路径 root html; #首页文件。以下按顺序匹配 index index.html index.htm; } 修改后的配置 location / { #访问路径,可相对也可绝对路径 root html; #首页文件。以下按顺序匹配 index index.html index.htm; if (!-e $request_filename) { rewrite ^/index.php(.*)$ /index.php?s=$1 last; rewrite ^(.*)$ /index.php?s=$1 last; break; } } ~~~