nginx 下开启pathinfo模式

时间:2022-10-18 00:27:59

前几天自己新弄了个服务器,nginx的环境, 看到thinkcmf的框架,下载下来准备研究下,安装完成后,发现 url 是 普通模式,然后我就按照那个手册去后台开启了pathinfo模式,这一改完蛋了,网站的url的确是改程pathinfo模式了,但是解析不了,点任何链接都是显示首页。(前后台都是这样,然后我重装了N次尝试找到原因)。后来大概百度找了N多,搞了快俩天。对于我这种搞后台的,对linux相关差不多是小白,这些配置我也不太懂,只能先记录下来以便以后再具体研究了,现总结下:

默认nginx是不开启pathinfo模式的,需要配置,首先去php.ini里把 cgi.fix_pathinfo开启 并设置为1(cgi.fix_pathinfo=1),重启php;

然后需要nginx.conf里配置东西 ,这个是我原配置。

nginx 下开启pathinfo模式

然后找了段代码。我理解的意思是  把location相关的原代码全部删除掉,加上我找的这段代码,注意此时include 的 enable-php.conf也有location的相关配置(其他nginx系统可能也有类似的配置文件,打开都看看,我在这一开始没注意,不懂,没删除这段,坑了好久);找的代码

        if (!-e $request_filename)
                {
                    rewrite ^\/([^\.]*)$ /index.php/$1 last;
                    break;
                }
        location ~ \.php
            {
                try_files $uri =404;
                fastcgi_pass  unix:/tmp/php-cgi.sock;
                fastcgi_index index.php;
                include fastcgi.conf;#注意这里有的系统是fcgi.conf 实际就是nginx下的conf目录的文件
                set $path_info "";#初始化一个变量
                set $real_script_name $fastcgi_script_name;#初始化一个变量,并且获取到一个原始赋值
                if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {#检测如果.php后面还存在/开始参数,将参数处理
                    set $real_script_name $1;#将第一个正则子串匹配到的赋值
                    set $path_info $2;#将第二个正则子串匹配到的赋值
                }
                fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;#修改SCRIPT_FILENAME值
                fastcgi_param SCRIPT_NAME $real_script_name;#修改SCRIPT_NAME值
                fastcgi_param PATH_INFO $path_info;#修改PATH_INFO值
                #上述三个赋值都是replace into的模式,这些值都是写在fcgi.conf中
            }

最终配置结果

server
    {
        listen 80 ;
        #listen [::]:80 default_server ipv6only=on;
        server_name     xxxx.com ;
        index index.html index.htm index.php;
        root  /home/wwwroot/thinkcmf;

        #error_page   404   /404.html;

        if (!-e $request_filename)
                {
                    rewrite ^\/([^\.]*)$ /index.php/$1 last;
                    break;
                }
        location ~ \.php
            {
                try_files $uri =404;
                fastcgi_pass  unix:/tmp/php-cgi.sock;
                fastcgi_index index.php;
                include fastcgi.conf;#注意这里有的系统是fcgi.conf 实际就是nginx下的conf目录的文件
                set $path_info "";#初始化一个变量
                set $real_script_name $fastcgi_script_name;#初始化一个变量,并且获取到一个原始赋值
                if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {#检测如果.php后面还存在/开始参数,将参数处理
                    set $real_script_name $1;#将第一个正则子串匹配到的赋值
                    set $path_info $2;#将第二个正则子串匹配到的赋值
                }
                fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;#修改SCRIPT_FILENAME值
                fastcgi_param SCRIPT_NAME $real_script_name;#修改SCRIPT_NAME值
                fastcgi_param PATH_INFO $path_info;#修改PATH_INFO值
                #上述三个赋值都是replace into的模式,这些值都是写在fcgi.conf中
            }
        access_log  /home/wwwlogs/access.log  access;
    }

重启nginx,网站正常。

对了,重要参考网址:https://my.oschina.net/longxuu/blog/190223