V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
tntsec
V2EX  ›  NGINX

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

  •  
  •   tntsec · 2015-10-04 08:22:26 +08:00 · 4624 次点击
    这是一个创建于 3338 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    13 条回复    2015-10-04 22:26:26 +08:00
    tntsec
        1
    tntsec  
    OP
       2015-10-04 09:39:29 +08:00
    一年过去了,没人告诉我
    sunyang
        2
    sunyang  
       2015-10-04 09:56:36 +08:00
    一年过去了,你还没弄懂啊?
    Roope
        3
    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
        4
    tntsec  
    OP
       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
        5
    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
        6
    fengjianxinghun  
       2015-10-04 12:07:25 +08:00 via iPad
    加一个记号。。
    xiqingongzi
        7
    xiqingongzi  
       2015-10-04 15:52:59 +08:00
    我原来试过。完全不开 Pathinfo
    把伪静态配置好。效果一样的
    tntsec
        8
    tntsec  
    OP
       2015-10-04 16:03:22 +08:00
    @xiqingongzi 似乎是有这个问题,所以我也不知道我当前到底有没有开启 Pathinfo
    MaiCong
        9
    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
        10
    MaiCong  
       2015-10-04 16:22:59 +08:00   ❤️ 1
    修改为楼主的配置,就是:

    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
        11
    tntsec  
    OP
       2015-10-04 16:41:56 +08:00
    @MaiCong 你的这个实测没有出现路径重复和 404 ,应该是标准答案
    不过 location ~ ^(.+\.php)(.*)$ 和 location ~ [^/].php(/|$) { 这有什么区别
    MaiCong
        12
    MaiCong  
       2015-10-04 16:43:43 +08:00   ❤️ 1
    @tntsec 正则的两种写法
    xiqingongzi
        13
    xiqingongzi  
       2015-10-04 22:26:26 +08:00 via Android
    @tntsec 后来再装就直接调用伪静态。。。懒得开 Pathinfo 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2764 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:52 · PVG 22:52 · LAX 06:52 · JFK 09:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.