突然我就不知道 nginx 的 Pathinfo 该怎么配置了

2015-10-04 08:22:26 +08:00
 tntsec

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 到底该怎么配置?

4617 次点击
所在节点    NGINX
13 条回复
tntsec
2015-10-04 09:39:29 +08:00
一年过去了,没人告诉我
sunyang
2015-10-04 09:56:36 +08:00
一年过去了,你还没弄懂啊?
Roope
2015-10-04 10:09:54 +08:00
在 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
tntsec
2015-10-04 10:24:56 +08:00
@Roope 官方文档是 13 年的,我的配置文件里的第一种方法是 typecho 开发者 70 自己写的 http://www.l4zy.com/posts/configure-nginx-to-support-php-pathinfo.html

第二种是我百度后找到的

不过都跟官方的完全不同,都可以用

cgi.fix_pathinfo 这条也完全没有开启过
Roope
2015-10-04 10:31:11 +08:00
@tntsec 你可以看看 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;
fengjianxinghun
2015-10-04 12:07:25 +08:00
加一个记号。。
xiqingongzi
2015-10-04 15:52:59 +08:00
我原来试过。完全不开 Pathinfo
把伪静态配置好。效果一样的
tntsec
2015-10-04 16:03:22 +08:00
@xiqingongzi 似乎是有这个问题,所以我也不知道我当前到底有没有开启 Pathinfo
MaiCong
2015-10-04 16:19:08 +08:00
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;
}
MaiCong
2015-10-04 16:22:59 +08:00
修改为楼主的配置,就是:

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;
}
tntsec
2015-10-04 16:41:56 +08:00
@MaiCong 你的这个实测没有出现路径重复和 404 ,应该是标准答案
不过 location ~ ^(.+\.php)(.*)$ 和 location ~ [^/].php(/|$) { 这有什么区别
MaiCong
2015-10-04 16:43:43 +08:00
@tntsec 正则的两种写法
xiqingongzi
2015-10-04 22:26:26 +08:00
@tntsec 后来再装就直接调用伪静态。。。懒得开 Pathinfo 了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/225498

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX