nginx下支持PATH_INFO详解

kevin.Zhu 发布于:2013-1-16 13:47 分类:Nginx  有 10 人浏览,获得评论 0 条  

1.可以通过rewrite方式代替php中的PATH_INFO
 
实例:thinkphp的pathinfo解决方案
设置URL_MODEL=2
 
location / {
    if (!-e $request_filename){
        rewrite ^/(.*)$ /index.php?s=/$1 last;
    }
}
 
2.nginx配置文件中设置PATH_INFO值
请求的网址是/abc/index.php/abc
 
PATH_INFO的值是/abc
SCRIPT_FILENAME的值是$doucment_root/abc/index.php
SCRIPT_NAME /abc/index.php
 
旧版本的nginx使用如下方式配置
 
location ~ .php($|/) {
    set $script $uri;
    set $path_info "";
 
    if ($uri ~ "^(.+.php)(/.+)") {
        set $script $1;
        set $path_info $2;
    }
 
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$script;
    fastcgi_param SCRIPT_NAME $script;
    fastcgi_param PATH_INFO $path_info;
}
 
新版本的nginx也可以使用fastcgi_split_path_info指令来设置PATH_INFO,旧的方式不再推荐使用,在location段添加如下配置。
 
location ~ ^.+\.php {
  (...)
  fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
  fastcgi_param SCRIPT_FILENAME /path/to/php$fastcgi_script_name;
  fastcgi_param PATH_INFO $fastcgi_path_info;
  fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
  (...)
}
 
 
 
最后可能有人要问为什么apache不会出现这个问题?
 
apache一般是以模块的方式运行php,apache可以对$_SERVER['PATH_INFO']的值进行设置,不需要另外配置。