nginx解决ThinkPHP PATHINFO不支持问题

作者:袖梨 2022-06-30

好久没写PHP,最近因为项目指定ThinkPHP于是又重温PHP狂潮,由于长期写JavaScript以至于我忘了PHP的数组竟然还可以自定义key...闹笑话了。
ThinkPHP默认不是使用PATHINFO模式,对于目前主流的流行框架,貌似PATHINFO已经成为流行,更让我意外的是ThinkPHP还能支持路由,有点类似于Python网络框架的路由了。之前在网上看不少人在nginx开启PATHINFO模式主要修改localhost \.php 里的内容,但最近发现了一条更简便的方法:

代码如下 复制代码

location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
}

或者更高级点的

在nf文件增加如下配置

代码如下 复制代码

if (!-e $request_filename)
{
rewrite ^/(.*)index.php(.*)$ $1/index.php?s=$2 last;
break;

}

利用了nginx的url重写机制实现了这一功能,而ThinkPHP的config.php也不需要添加:URL_MODEL => 1这个配置了。

补充:

网上搜了很多方法都不奏效,研究了一天,发现通过以下的配置可以完美支持 'URL_MODEL' => 2 的情况了

代码如下 复制代码

location /project/ {

index index.php;

if (!-e $request_filename) {

rewrite ^/project/(.*)$ /project/index.php/$1 last;

break;

}

}

location ~ .+\.php($|/) {

set $script $uri;

set $path_info "/";

if ($uri ~ "^(.+\.php)(/.+)") {

set $script $1;

set $path_info $2;

}

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php?IF_REWRITE=1;

include /APMServ/nginx/conf/fastcgi_params;

fastcgi_param PATH_INFO $path_info;

fastcgi_param SCRIPT_FILENAME $document_root/$script;

fastcgi_param SCRIPT_NAME $script;

}

这里先把project下的请求都转发到index.php来处理,亦即ThinkPHP的单一入口文件;然后把对php文件的请求交给fastcgi来处理,并且添加对PATH_INFO的支持。

重启Nginx以后,http://loc*al*ho*st/project/Index/insert, http://lo*c*alho*st/project/index.php/Index/delete 这样的URL都可以正确访问了。

相关文章

精彩推荐