nginx 什么版本支持tp5 nginx pathinfoo

您的位置:&&Nginx支持PHP的PATHINFO模式配置分析
ThinkPHP5发布了,最近也要基于ThinkPHP5做一个小项目,借着这个机会彻底梳理下Nginx下有关pathinfo的配置。本文的宗旨是:远离咬文嚼字的理论,尽量的通俗。所以不可避免的会出现遗漏和疏忽,敬请指教~
CGI、FastCGI和PATHINFO
通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。
神烦理论瞎,拿nginx、php这种模式来简单理解cgi更为直观:
-------------
nginx:“哎呀,收到客户端的一个http请求,该干活了......咦,有php-fpm这小子的活儿!”
nginx:“别睡了,别睡了,php-fpm你该起来干活儿了...”
php-fpm:“好滴,把客户端的http请求消息体给我一份啊......”
php-fpm:“nginx,我的活儿干完了,接收我要发给客户端的数据,麻溜的...”
nginx:“好滴,合作愉快”
-------------
Nginx接收到php-fpm处理的结果后,就可以响应客户端的http请求给予一个回应了,客户端的这一次http请求就结束了,一张由php产生的华丽丽的网页就呈现在网民的面前。在这段对话中,nginx与php-fpm并没有相互推诿扯皮,交流的很顺畅;没有推诿扯皮的原因就是nginx与php-fpm之间的数据和消息传递使用了统一的标准格式,这个标准格式就是CGI,所以倘若nginx和php-fpm中有任何一方不按CGI标准来玩,你推诿扯皮也没用。
发展到现在,对CGI的理解可以是一种标准接口(协议规范),也可以理解成处理动态网页的某种语言,比如:php、asp都可以宽泛的看做是一种cgi,这个时候cgi就被泛化了但依然包含了不推诿扯皮的交流标准的这一层含义。
FastCGI的Fast已经表明含义了,是一种快速的CGI,也是现代动态网页语言与web server之间普遍所采用的。FastCGI像是一个常驻型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算,即FastCGI程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
nginx与php-fpm就是采用的FastCGI模式。
常常会见到这种格式的Url/index.php/Article/Post/index.html ,这种Url理解有两种方式:
index.php当做一个目录看待:访问服务器根目录下的index.php目录下的Article目录下的Post目录下的index.html静态html文本文件;
index.php当做一个PHP脚本看待:访问服务器根目录下的index.php脚本,由该脚本产生html页面,Url中/Article/Post/index.html这一部分作为index.php脚本中使用的某种类型的参数。
绝大部分情况下,这种格式的Url理解方式是第二种,而/Article/Post/index.html这一部分理解成PATHINFO就好了。其实PATHINFO是一个CGI 1.1的一个标准,经常用来做为传参载体,只不过咱们没必要深入。
由于Apache的默认配置文件开启了PATHINFO的支持,Apache+PHP的环境下PATHINFO格式的Url可以不出任何错误的执行正确路径的PHP脚本并在脚本中使用PATHINFO中的参数。而Nginx默认提供的有关执行php-fpm运行PHP脚本的默认配置文件中并没有启用PATHINFO,从而导致了一个长久以来的误解:nginx不支持pathinfo。
早期版本的nginx确实不能直接支持pathinfo,但有变相的解决方法,网络上的一些配置nginx支持pathinfo的文章大多就是这种变相解决方法。nginx其实早已可以很简单的通过fastcgi_split_path_info指令支持pathinfo模式了,严格来说是nginx的0.7.31以上版本就可以使用这个指令了。
Nginx的PATHINFO配置
1、关于nginx配置指令的一些墨迹内容
默认的nginx是对http请求的uri进行正则匹配来决定这个请求是否要交给php-fpm来执行;nginx中有关是否要交给php-fpm这个cgi来解析执行某个php脚本的默认配置(nginx1.8.0)如下:
location ~ \.php$ {
fastcgi_pass
127.0.0.1:9000;
fastcgi_index
fastcgi_param
SCRIPT_FILENAME
/scripts$fastcgi_script_
上述location ~ \.php$这段是一个正则匹配,被匹配的内容是http请求的uri,正则表达式就是\.php$,而~则是nginx的location指令中的一个标记符,表示这个location匹配uri采用正则表达式来匹配;在这里URI和URL还是有区别,请厘清。正则表达式中$表示必须以某个字符或字符串结尾,这样上述默认配置中仅能匹配到以.php为结尾的uri交给php-fpm去解析,如下:
1、/index.php 匹配
2、/admin/index.php?m=Index&a=index 匹配,注意这里Url中有Get变量,nginx中location匹配的路径是uri,也就是虚拟路径部分,本例也就是:/admin/index.php
3、/admin/index.php/Index/index 不匹配,pathinfo模式,nginx将index.php理解成一个目录了,这种情况下的uri为:/admin/index.php/Index/index ,结尾并没有.php这种条件
正确配置Nginx对php的pathinfo支持,先要理解清楚nginx配置文件中是如何将某个请求交给php-fpm来执行的,以上述配置段为例来分析一下:
root:这个指令配置了php脚本的根目录,可以使用相对路径也可以使用绝对路径,上述示例中是html,表示php的根目录在nginx安装目录下的html目录;这里的目录一般与nginx配置文件server段下的root目录一致,也就是web服务器的根目录;且大多数的时候建议使用绝对地址。假设这里的root设置为:/var/www//wwwRoot,这样网站根目录的绝对地址就是/var/www//wwwRoot,配合各种ftp服务器端配置,将ftp登录的家目录设定为/var/www/。拿ThinkPHP来举例:框架和核心模块文件可以放置在/var/www/目录下,而入口文件放置在/var/www//wwwRoot下;这样框架和核心模块文件就不会被Url直接访问到。
fastcgi_pass:这个指令配置了fastcgi监听的端口,可以是TCP也可以是unix socket,这里一般推荐走TCP,这个TCP是由php-fpm配置文件决定的,不再详细介绍。
fastcgi_index:这个指令配置了fastcgi的默认索引文件,与server端下index指令类似。
fastcgi_param:这个指令配置了fastcgi的一些参数,传递给php-fpm,这个指令是3段式,第一段fastcgi_param指令名称,第二段传递给php-fpm的参数的名称,第三段传递给php-fpm参数的值,也就是说fastcgi_param配置了一系列的key-value类型的值;对PHP来说fastcgi_param指令产生的key-value键值对最后都(未确认,暂时这么理解吧~)转换成了超全局数组变量$_SERVER的键值对,上述示例中fastcgi_param &SCRIPT_FILENAME &/scripts$fastcgi_script_name就配置了一个SCRIPT_FILENAME的fastcgi参数,转换成PHP中的变量就是$_SERVER['SCRIPT_FILENAME'] ,PHP参考手册中对$_SERVER['SCRIPT_FILENAME']的说明是:“当前执行脚本的绝对路径”。对nginx来说,将请求正确的交给php-fpm来执行正确的php脚本就是由fastcgi_param指令配置的SCRIPT_FILENAME来决定的,所以nginx能默契的与php-fpm协作,fastcgi_param指令正确的配置了SCRIPT_FILENAME值是关键。
include:这个指令将指定的文本文件的内容作为配置项包含进来,与php中的include差不多意思,这个指令的参数就是一个配置文件的路径,可以是相对路径也可以是绝对路径,路径中可以使用通配符*;nginx的虚拟主机实现就使用到了这个指令,以及指令参数中使用到通配符。include fastcgi_ 则表示将主配置文件目录下的fastcgi_params文本文件中的配置内容包含进来。读取fastcgi_params文本文件,可以发现这个文件中的文本内容如下:
fastcgi_param
QUERY_STRING
fastcgi_param
REQUEST_METHOD
fastcgi_param
CONTENT_TYPE
fastcgi_param
CONTENT_LENGTH
fastcgi_param
SCRIPT_NAME
$fastcgi_script_
fastcgi_param
REQUEST_URI
fastcgi_param
DOCUMENT_URI
$document_
fastcgi_param
DOCUMENT_ROOT
$document_
fastcgi_param
SERVER_PROTOCOL
fastcgi_param
$https if_not_
fastcgi_param
GATEWAY_INTERFACE
fastcgi_param
SERVER_SOFTWARE
nginx/$nginx_
fastcgi_param
REMOTE_ADDR
fastcgi_param
REMOTE_PORT
fastcgi_param
SERVER_ADDR
fastcgi_param
SERVER_PORT
fastcgi_param
SERVER_NAME
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param
REDIRECT_STATUS
可以发现包含进来的fastcgi_params文件依然使用了fastcgi_param指令,配置了一大堆键值对,拿fastcgi_param SERVER_SOFTWARE nginx/$nginx_来简单分析下:SERVER_SOFTWARE与$_SERVER['SERVER_SOFTWARE']对应,做后台管理系统常常会用到这个变量来显示服务器使用的软件,在php代码中读取出来的值就是nginx中这个地方配置的,这个时候PHP中$_SERVER['SERVER_SOFTWARE']读取出来的内容就是诸如nginx/1.8.0这样的字符串,这段nginx的配置中$nginx_version是nginx提供的一个变量,变量内容就是nginx版本号。
另外fastcgi_params文件与fastcgi.conf的内容是一摸一样的,任意包含一个即可,为什么会有两个一摸一样的呢?这是nginx的开发者为不同操作系统平台提供的,无需深究。
2、nginx支持pathinfo的本质和配置实现
依据上述第1条的墨迹得出两个结论:
1、nginx需要正确将请求交给php-fpm来执行php脚本,nginx先得正确分析出URI中是否要去请求某个PHP脚本;
2、当php-fpm正确执行某个PHP脚本后,PHP中pathinfo模式实现单一入口需要PHP中$_SERVER['PATH_INFO']包含了正确的pathinfo值;而PHP中的$_SERVER变量由nginx的fastcgi_param指令来决定;
所以让nginx支持pathinfo的配置中要修改内容也围绕这个两个点来展开。
第一、nginx的location能匹配到pathinfo格式的URI,去掉URI必须是.php结尾的限定,修改如下:
第二、需要将URI进行正则切割,产生正确的PHP脚本文件路径和pathinfo值;
nginx的0.7.31以上版本以后就可以使用fastcgi_split_path_info指令了,这个指令的参数为一个正则表达式,这个正则表示必须有两个捕获子组,从左往右捕获的第一子组自动赋值给nginx的$fastcgi_script_name变量,第二个捕获的子组自动赋值给nginx的$fastcgi_path_info变量。
通常情况下,也就是在没有使用fastcgi_split_path_info指令时nginx的$fastcgi_script_name变量保存着相对PHP脚本的URI,这个URI相对于web根目录就是实际PHP脚本的路径,所以下方的关于SCRIPT_FILENAME的配置很常见。
fastcgi_param
SCRIPT_FILENAME $document_root$fastcgi_script_
这样在高版本的nginx支持php的pathinfo配置就出来了,这种方式是正规且推荐的:其原理就是nginx正则分析好需要执行的PHP脚本路径和PATH_INFO变量。
##匹配nginx需要交给php-fpm执行的URI,先要允许pathinfo格式的URL能够被匹配到
##所以要去掉$
##nginx文档中的匹配规则为:^(.+\.php)(.*)$
##还有~ \.php这种写法 和 ~ \.php($|/)这种写法
##都是差不多意思没啥严格区别
##唯一区别就是有多个匹配php的location的话需要留意权重差异
location ~ ^(.+\.php)(.*)$ {
/var/www//wwwR
fastcgi_pass
127.0.0.1:9000;
fastcgi_index
##增加 fastcgi_split_path_info指令,将URI匹配成PHP脚本的URI和pathinfo两个变量
##即$fastcgi_script_name 和$fastcgi_path_info
fastcgi_split_path_info
^(.+\.php)(.*)$;
##PHP中要能读取到pathinfo这个变量
##就要通过fastcgi_param指令将fastcgi_split_path_info指令匹配到的pathinfo部分赋值给PATH_INFO
##这样PHP中$_SERVER['PATH_INFO']才会存在值
fastcgi_param PATH_INFO $fastcgi_path_
##在将这个请求的URI匹配完毕后,检查这个绝对地址的PHP脚本文件是否存在
##如果这个PHP脚本文件不存在就不用交给php-fpm来执行了
##否者页面将出现由php-fpm返回的:`File not found.`的提示
if (!-e $document_root$fastcgi_script_name) {
##此处直接返回404错误
##你也可以rewrite 到新地址去,然后
return 404;
fastcgi_param
SCRIPT_FILENAME
$document_root$fastcgi_script_
还有一种让nignx支持pathinfo的方式,这种方式需要PHP配置文件php.ini中开启cgi.fix_pathinfo配置项,赋值为1(php.ini中这个配置项的默认值就是1),早前这个配置项导致一个php任意文件解析的漏洞,见此:,不过现在这个漏洞早已堵上,在我本机上测试,php-fpm将会直接返回403状态码和Access denied.的文字。
location ~ .php {
/var/www//wwwR
fastcgi_pass
127.0.0.1:9000;
fastcgi_index
##先加载默认的fastcgi配置项
include fastcgi_
##直接将网站根目录和完整的URI拼接起来后赋值给SCRIPT_FILENAME
##实际上此处赋值给SCRIPT_FILENAME的PHP脚本文件可能并不存在
##此处赋的值可能是/var/www//index.php/Index/index形式
fastcgi_param
SCRIPT_FILENAME $document_root$fastcgi_script_
##同时将完整的URI赋值给PATH_INFO,此处赋的值可能是/index.php/Index/index形式
fastcgi_param PATH_INFO $fastcgi_script_
由于php配置文件php.ini中的cgi.fix_pathinfo配置项处于开启状态,php-fpm接收到这些有问题的SCRIPT_FILENAME和PATH_INFO后会内部自动修正,所以这种情况在PHP代码中$_SERVER['SCRIPT_FILENAME']和$_SERVER['PATH_INFO']是可以正确的修正解析的,这样配置nginx相当于把URI匹配出正确的SCRIPT_FILENAME和PATH_INFO值交给了php-fpm来执行,这种情况下你会发现PHP中存在$_SERVER['ORIG_SCRIPT_FILENAME']和$_SERVER['ORIG_PATH_INFO']这两个变量,或许还存在$_SERVER['ORIG_SCRIPT_NAME']。
最后将不再推荐的配置方式贴出来,贴出来的目的是分析下配置原理,加深nginx的配置指令理解
##因为nginx中$fastcgi_script_name内建变量无法赋值
##所有通过设置$real_script_name这个自定义nginx变量来做中间值
location ~ \.php {
/var/www//wwwR
fastcgi_pass
127.0.0.1:9000;
fastcgi_index
##先加载默认的fastcgi配置项
##正则解析路径,先使用set指令产生两个nginx变量并赋值
##此处先将$path_info值赋值为空
set $path_info "";
set $real_script_name $fastcgi_script_
##正则匹配URI,若能匹配将产生两个子组
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
##将两个子组赋值给刚生成的两个nginx变量
set $real_script_name $1;
set $path_info $2;
##将可能匹配到的$path_info值通过fastcgi_param指令设置进去
fastcgi_param PATH_INFO
fastcgi_param SCRIPT_FILENAME $document_root$real_script_
##覆盖fastcgi_params文件中默认的SCRIPT_NAME配置项
fastcgi_param SCRIPT_NAME
$real_script_
转载请注明本文标题和链接:《》
邮箱(必填)
网址(选填)要想让nginx支持PATH_INFO,首先需要知道什么是pathinfo,为什么要用pathinfo?
pathinfo不是nginx的功能,pathinfo是php的功能。
php中有两个pathinfo,一个是环境变量$_SERVER['PATH_INFO'];另一个是pathinfo函数,pathinfo() 函数以数组的形式返回文件路径的信息;。
nginx能做的只是对$_SERVER['PATH_INFO]值的设置。
下面我们举例说明比较直观。先说php中两种pathinfo的作用,再说如何让nginx支持pathinfo。
php中的两个pathinfo
php中的pathinfo()
pathinfo()函数可以对输入的路径进行判断,以数组的形式返回文件路径的信息,数组包含以下元素。
[dirname] &路径的目录[basename] 带后缀 文件名[extension] &文件后缀[filename] &不带后缀文件名(需php5.2以上版本)
print_r(pathinfo(&/nginx/test.txt&));
[dirname] =& /nginx
[basename] =& test.txt
[extension] =& txt
[filename] =& test
&&&&[dirname]
&&&&[basename]
&&&&[extension]
&&&&[filename]
php中的$_SERVER['PATH_INFO']
PHP中的全局变量$_SERVER['PATH_INFO'],PATH_INFO是一个CGI 1.1的标准,经常用来做为传参载体。
被很多系统用来优化url路径格式,最著名的如THINKPHP框架。
对于下面这个网址:
/index.php/test/my.html?c=index&m=search
我们可以得到 $_SERVER['PATH_INFO'] = ‘/test/my.html’,而此时 $_SERVER['QUERY_STRING'] = 'c=index&m=search';
如果不借助高级方法,php中/index.php?type=search 这样的URL很常见,大多数人可能会觉得不太美观而且对于搜索引擎也是非常不友好的(实际上有没有影响未知),因为现在的搜索引擎已经很智能了,可以收入带参数的后缀网页,不过大家出于整洁的考虑还是想希望能够重写URL,
下面是一段解析利用PATH_INFO的进行重写的非常简单的代码:
if(!isset($_SERVER['PATH_INFO']))
$pathinfo = 'default';
$pathinfo = explode('/', $_SERVER['PATH_INFO']);
if(is_array($pathinfo) && !empty($pathinfo))
$page = $pathinfo[1];
$page = 'default.php';
有了以上认识我们就可以介入nginx对$_SERVER['PATH_INFO']支持的问题了。在这之前还要介绍一个php.ini中的配置参数cgi.fix_pathinfo,它是用来对设置cgi模式下为php是否提供绝对路径信息或PATH_INFO信息。没有这个参数之前PHP设置绝对路径PATH_TRANSLATED的值为SCRIPT_FILENAME,没有PATH_INFO值。设置这个参数为cgi.fix_pathinfo=1后,cgi设置完整的路径信息PATH_TRANSLATED的值为SCRIPT_FILENAME,并且设置PATH_INFO信息;如果设为cgi.fix_pathinfo=0则只设置绝对路径PATH_TRANSLATED的值为SCRIPT_FILENAME。cgi.fix_pathinfo的默认值是1。
nginx默认是不会设置PATH_INFO环境变量的的值,需要php使用cgi.fix_pathinfo=1来完成路径信息的获取,但同时会带来,需要把cgi.fix_pathinfo=0设置为0,这样php就获取不到PATH_INFO信息,那些依赖PATH_INFO进行URL美化的程序就失效了。
1.可以通过rewrite方式代替php中的PATH_INFO
实例:thinkphp的pathinfo解决方案
设置URL_MODEL=2
location / {
if (!-e $request_filename){
rewrite ^/(.*)$ /index.php?s=/$1
$request_filename){
&&&&&&&&rewrite
/index.php?s=/$1
2.nginx配置文件中设置PATH_INFO值
请求的网址是/abc/index.php/abc
PATH_INFO的值是/abc
SCRIPT_FILENAME的值是$doucment_root/abc/index.php
SCRIPT_NAME /abc/index.php
旧版本的nginx使用如下方式配置
location ~ .php($|/) {
set $script $
set $path_info &&;
if ($uri ~ &^(.+.php)(/.+)&) {
set $script $1;
set $path_info $2;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.
fastcgi_param SCRIPT_FILENAME $document_root$
fastcgi_param SCRIPT_NAME $
fastcgi_param PATH_INFO $path_
~ .php($|/)
$script $uri;
$path_info &&;
~ &^(.+.php)(/.+)&)
&&&&&&&&set
$script $1;
&&&&&&&&set
$path_info $2;
&&&&fastcgi_pass
127.0.0.1:9000;
&&&&fastcgi_index
index.php;
&&&&fastcgi_param SCRIPT_FILENAME
$document_root$script;
&&&&fastcgi_param
SCRIPT_NAME
&&&&fastcgi_param PATH_INFO
$path_info;
新版本的nginx也可以使用fastcgi_split_path_info指令来设置PATH_INFO,旧的方式不再推荐使用,在location段添加如下配置。
location ~ ^.+.php {
fastcgi_split_path_info ^((?U).+.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME /path/to/php$fastcgi_script_
fastcgi_param PATH_INFO $fastcgi_path_
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_
~ ^.+.php
&&fastcgi_split_path_info
^((?U).+.php)(/?.+)$;
&&fastcgi_param
SCRIPT_FILENAME
/path/to/php$fastcgi_script_name;
&&fastcgi_param
$fastcgi_path_info;
&&fastcgi_param
PATH_TRANSLATED
$document_root$fastcgi_path_info;
最后可能有人要问为什么apache不会出现这个问题?
apache一般是以模块的方式运行php,apache可以对$_SERVER['PATH_INFO']的值进行设置,不需要另外配置。
除非注明,本站文章均为:
原创,转载请注明本文地址:
本文已收录于以下专栏:
相关文章推荐
Introduction
This how-to will show you how to install LEMP on a Ubuntu 16.04 cloud server or VPS. L...
这两天网上开始疯传一个“nginx文件类型错误解析漏洞”,这个“漏洞”是这样的:
假设有如下的 URL:http://phpvim.net/foo.jpg,当访问 http://phpvim.net...
apache下path_info是可以直接取到,但nginx下就比较蛋疼了,对于thinkphp或CI来说更是如此,path_info是取不到的,路由不正常所以很多页面都会404,据说用fix_pat...
nginx开启pathinfo模式的两种方式
Nginx(PHP/fastcgi)的PATH_INFO配置NginxPHPfastcgi的PATH_INFO配置
NginxPHPfastcgi的PATHINFO配置
方案一php内置解析
方案二n...
让Nginx支持pathinfo
Nginx服务器默认不支持pathinfo, 在需要pathinfo支持的程序中(如thinkphp),则无法支持”/index.php/Home/Index/ind...
支持pathinfo模式
首先,在ssh中执行
touch /usr/local/nginx/conf/pathinfo.conf
创建pahtinfo.conf文件
然后在这个文件中添加以下内容...
对于ThinkPHP的URL访问路劲如:http://域名/index.php/Index/BlogTest/read,原先的Nginx的是不支持的pathinfo路劲的,导致你在thinkPHP5上...
我使用的一键安装包是在lnmp.org下载的 其他版本的
他的最新文章
讲师:汪剑
讲师:刘道宽
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
服务器上安装了lanp一键安装包,配置nginx支持pathinfo访问模式时一直不成功
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
新版本的nginx有一个自带的函数可以处理pathinfo,如下:
location ~ .php(.*)$ {
fastcgi_pass
unix:/tmp/php-cgi.
fastcgi_index
fastcgi_split_path_info ^(.+.php)(.*)$;
fastcgi_param
$fastcgi_path_
fastcgi_param
SCRIPT_FILENAME $document_root$fastcgi_script_
fastcgi_param
PATH_TRANSLATED $document_root$fastcgi_path_
include fcgi.
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
试试这个。
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:}

我要回帖

更多关于 nginx php pathinfo 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信