nginx开启pathinfo模式,运行后index.php的index会被过滤

服务器使用一键lnmp安装的,开启了pathinfo模式后发现使用header跳转时index会被过滤。
使用的是TP系统,U方法与header location之后会出现这种情况,
http://xx.com/index.php/a/b 会变成http://xx.com/.php/a/b,而地址栏输入没有问题

贴上配置文件
1、站点conf

server
    {
        listen 80;
        #listen [::]:80;
        server_name xx.com ;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /data;

        include none.conf;
        #error_page   404   /404.html;

        # Deny access to PHP files in specific directory
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

        #include enable-php.conf;

        include  enable-php-pathinfo.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /.well-known {
            allow all;
        }

        location ~ /\.
        {
            deny all;
        }

        access_log  xx.com.log;
    }

2、enable-php-pathinfo.conf

location ~ [^/]\.php(/|$)
        {
            fastcgi_pass  unix:/tmp/php-cgi.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
            include pathinfo.conf;
        }

3、fastcig.conf


fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";

4、pathinfo.conf

fastcgi_split_path_info ^(.+?\.php)(/.*)$;
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO       $path_info;
try_files $fastcgi_script_name =404;
阅读 6.5k
3 个回答

试一下增加rewrite

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

TP框架在Apache下是没有问题的,但是Nginx默认是不支持PathIfon模式的,
只需要配置nginx.conf的一个文件就可以支持pathinfo和rewrite两种url访问方式

vim /etc/nginx/nginx.conf

1、支持rewrite方式:
在 location / 处添加以下代码

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

最终变成

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

2.实现pathinfo模式
找到有效的 location ~ .php$那部分
首先,将这个$去掉,
然后里面添加以下两行代码

fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;

最终变成

location ~ \.php {
            root           html/code;
            fastcgi_pass   127.0.0.1:9000;
            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;
            include        fastcgi_params;
        }

3.重启nginx和php-fpm即可使用了

service nginx restart
service php-fpm restart
server {
    listen 80;
    server_name test.com;
    
    root /var/www/test;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php$uri;
    }

    location ~ ^(.+\.php)(.*)$ { 
        include fastcgi.conf;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;        
    }      
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题