霜天部落 | 关注LAMP高性能、高并发架构的设计与研究

让 nginx 提供 PATH_INFO 并实现 PATH_INFO 重写

采用nginx + php-fpm的配置,nginx默认情况下,不提供PATH_INFO,导致一些使用 path_info 的PHP框架无法使用。不过可以通过以下设置,可以让 nginx 提供 PATH_INFO,实现  PATH_INFO 重写。

新版Nginx 可以使用如下指令:

location ~ ^.+\.php {
(…)
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
(…)
}

其他版本中可以如下设置:

server {
    listen 80; 
    server_name www.sample.com;
    root /www;
    index index.php index.html;
    location / { 
        index index.php index.html index.htm;

        #以下部分实现重写
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /index.php/$1 last;
        }
        #也可以写在一个独立的文件中,然后include进来,如下一行
        #include /www_rewrite/.htaccess;

    }   
    location ~ \.php($|/) {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_buffers 8 128k;
        send_timeout 60; 
        include /etc/nginx/fastcgi_params;

        #这一部分实现PATH_INFO,使用$_SERVER['PATH_INFO']获取该值
        set $script_name $fastcgi_script_name;
        set $path_info ""; 
        if ($uri ~ "^(.+?\.php)(/.*)$") {
               set $script_name $1; 
               set $path_info $2; 
        }   
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param SCRIPT_NAME $script_name;
        #至此,已完成PATH_INFO的配置
    }   
}