技术解析

突然我就不知道 nginx 的 Pathinfo 该怎么配置了
0
2021-05-25 11:55:11
idczone

nginx 1.9

server 里针对 php 的 伪静态 配置,这个实际使用倒是没问题
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php$1 last;
}

这是现在的 location 配置
location ~ [^/].php(/|$) {
fastcgi_大带宽服务器split_path_info ^(.+?.php)(/.*)$;
fastcgi_pass unix:/dev/shm/fpm-cgi.sock;
fastcgi_index index.php;
fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/:/proc/";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

之前的配置
location ~ ..php(\/.)*$ {
fastcgi_pass unix:/dev/shm/fpm-cgi.sock;
fastcgi_index index.php;
fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/:/proc/";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

都没有问题,可以正常运行 typecho 程序,所以 pathinfo 到底该怎么配置?


一年过去了,没人告诉我

一年过去了,你还没弄懂啊?

在 Typecho 官方的文档上已经给出了详细的配置方法。
无法登录后台,点击前台链接或者后台登录时出现"404, not found"
这是 nginx 的设置时没有注意支持 pathinfo 导致的,具体关于 php pathinfo 的信息可以在网上搜索到。
解决方法
一般的出现这种情况时,nginx.conf 里的的 location 设置都是类似这样
location ~ .*\.php$
要支持 pathinfo ,要改成
location ~ .*\.php(\/.*)*$
然后在 location 里加上
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_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
在某些老版本的 php 里面,可能还要打开 php.ini 里的 cgi.fix_pathinfo
cgi.fix_pathinfo = 1

官方文档是 13 年的,我的配置文件里的第一种方法是 typecho 开发者 70 自己写的 http://www.l4zy.com/posts/configure-nginx-to-support-php-pathinfo.html
第二种是我百度后找到的
不过都跟官方的完全不同,都可以用
cgi.fix_pathinfo 这条也完全没有开启过

你可以看看 lnmp.org 一键安装包里面的 PATHINFO
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
try_files $fastcgi_script_name =404;

加一个记号。。

我原来试过。完全不开 Pathinfo
把伪静态配置好。效果一样的

似乎是有这个问题,所以我也不知道我当前到底有没有开启 Pathinfo

Nginx 加上这两句就行了:
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
例如这样配置:
location ~ .*\.php$
{
fastcgi_pass unix:/dev/shm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param DOCUMENT_ROOT /home/wwwroot/example$subdomain;
fastcgi_param SCRIPT_FILENAME /home/wwwroot/example$subdomain$fastcgi_script_name;
include fastcgi_params;
try_files $uri = 404;
}

修改为楼主的配置,就是:
location ~ ^(.+\.php)(.*)$
{
fastcgi_pass unix:/dev/shm/fpm-cgi.sock;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/:/proc/";
include fastcgi_params;
}

你的这个实测没有出现路径重复和 404 ,应该是标准答案
不过 location ~ ^(.+\.php)(.*)$ 和 location ~ [^/].php(/|$) { 这有什么区别

正则的两种写法

后来再装就直接调用伪静态。。。懒得开 Pathinfo 了

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服