Nginx(PHP/fastcgi)的PATH_INFO配置

  • NginxPHPfastcgi的PATH_INFO配置

    • NginxPHPfastcgi的PATHINFO配置
    • 方案一php内置解析
    • 方案二nginx正则解析

Nginx(PHP/fastcgi)的PATHINFO配置

PATHINFO是一个CGI 1.1的标准,经常用来做为传参载体,在Apache中, 当不加配置的时候, 对于PHP脚本, AcceptPathInfo是默认接受的,而对于Nginx下, 是不支持PATHINFO 的, 也就是需要设置才能使用PATHINFO模式.

我们可以使用PATH_INFO来代替Rewrite来实现伪静态页面, 很多PHP框架也使用PATHINFO模式来作为路由载体

Apache 默认设置PATHINFO原理分析

对于请求 http://wangying.sinaapp.com/tools/index.php/login/index

Apache都接受, 都会认为是对index.php的访问, 并会设置PATH_INFO为’/login/index’

print_r($_SERVER[“PATH_INFO”]);//login/index

nginx 模拟PATH_INFO

Nginx是通过对文件名的扩展名匹配,来决定是否要交给php cgi服务器去解释的.在nginx.conf中一般都有如下的默认配置段:

location ~ .php$ {
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}

对于形如tools/index.php/login/index这样的文件路径, Nginx正则匹配为路径而不是php文件. 所以我们需要去掉($)改写这段配置匹配扩展名:

location ~ .php {
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}

现在, 脚本路径已经交由PHP自己处理了. 那怎么增加PATH_INFO呢?

方案一:php内置解析

我们需要打开PHP中cgi.fix_pathinfo配置项, 打开这个配置项以后, PHP会去根据CGI规范来检查SCRIPT_FILENAME中那部分是访问脚本和PATH_INFO(ini配置解释), 并根据SCRIPT_NAME来修改PATH_INFO(和PATH_TRANSLATED)为正确的值然后, 就只要添加一个FASTCGI_PARAM项就好了:

location ~ .php {
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_script_name;
}

方案二:nginx正则解析

上面的解决方法, 把对路径的分析交给了PHP去处理,下面是由Nginx来分析路径(也就不需要fix_pathinfo),两种配置方案

#配置方案 使用nginx模块fastcgi_split_path_info(nginx版本>0.7.31)
location ~ \.php {
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
#先加载默认后解析赋值
include        fastcgi_params;
#正则解析路径
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param  PATH_INFO        $fastcgi_path_info;
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
}
/*
fastcgi_split_path_info
语法:fastcgi_split_path_info regex
使用字段:location
可用版本:0.7.31以上
这个指令允许为CGI specification设置SCRIPT_FILENAME、SCRIPT_NAME、PATH_INFO变量。正则包含两个组:
处理请求的脚本路径–>对应$fastcgi_script_name
脚本参数的值–>      对应$fastcgi_path_info
*/
location ~ ^.+\.php {
(...)
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO       $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
(...)
}
/*
示例请求”/show.php/article/0001”的参数SCRIPT_FILENAME将设置为”/path/to/php/show.php”,参数PATH_INFO为”/article/0001”*/
#配置方案2
#由于nginx内建只读变量$fastcgi_script_name无法赋值,所有通过设置$real_script_name变量来做中间值
location ~ \.php {
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
#先加载默认后解析赋值
include        fastcgi_params;
#正则解析路径
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 PATH_INFO       $path_info;
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME     $real_script_name;
}
/*nginx 把nginx解析url变量赋值给fastcgi_param,php通过$_SERVER获取fastcgi_param中的所有变量值 */
Array
(
[USER] => www
[HOME] => /home/www
[FCGI_ROLE] => RESPONDER
[QUERY_STRING] =>
[REQUEST_METHOD] => GET
[CONTENT_TYPE] =>
[CONTENT_LENGTH] =>
[SCRIPT_NAME] => /demos/doitnote/index.php  //重点关注
[REQUEST_URI] => /demos/doitnote/index.php/login/index
[DOCUMENT_URI] => /demos/doitnote/index.php/login/index
[DOCUMENT_ROOT] => /mnt/hgfs/vmhtml/doitphp
[SERVER_PROTOCOL] => HTTP/1.1
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_SOFTWARE] => nginx/1.1.19
[REMOTE_ADDR] => 192.168.127.1
[REMOTE_PORT] => 60422
[SERVER_ADDR] => 192.168.127.10
[SERVER_PORT] => 80
[SERVER_NAME] => www.doitphp.loc
[REDIRECT_STATUS] => 200
[PATH_INFO] => /login/index  //重点关注
[SCRIPT_FILENAME] => /mnt/hgfs/vmhtml/doitphp/demos/doitnote/index.php  //重点关注
[HTTP_HOST] => www.doitphp.loc
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20100101 Firefox/16.0
[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
[HTTP_ACCEPT_LANGUAGE] => zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
[HTTP_ACCEPT_ENCODING] => gzip, deflate
[HTTP_CONNECTION] => keep-alive
[HTTP_REFERER] => http://www.doitphp.loc/demos/doitnote/
[HTTP_CACHE_CONTROL] => max-age=0
[PHP_SELF] => /demos/doitnote/index.php/login/index
[REQUEST_TIME] => 1354246274
)

Nginx(PHP/fastcgi)的PATH_INFO配置相关推荐

  1. php环境informix,在Nginx + php-fpm(fastcgi)环境下配置informix的连接

    buildconf: checking installation... buildconf: autoconf version 2.59 (ok) buildconf: Your version of ...

  2. Nginx(PHP/fastcgi)的PATH_INFO问题

    引用: http://www.laruence.com/2009/11/13/1138.html server {listen 80;server_name localhost;index index ...

  3. 网络云盘项目——Nginx配置(配置Nginx访问FastCGI、FastDFS)

    一.本文目的 本项目分为6篇博客文章完成: 1.项目总体介绍:https://blog.csdn.net/qq_41453285/article/details/107871393. 2.Redis部 ...

  4. 在Mac上使用Nginx和FastCGI部署Flask应用

    最近在学习Flask,本文介绍一下如何部署Flask开发的应用,同时也学习一下Nginx的使用,这只是在Mac上的一个实验. 应用 这里使用的应用就是官方的文档中给出的Flaskr. 安装Nginx ...

  5. linux下nginx+python+fastcgi部署总结(web.py版)

    2019独角兽企业重金招聘Python工程师标准>>> 在上一篇文章linux下nginx+python+fastcgi部署总结(django版)中,我们部署了nginx+djang ...

  6. Nginx + CGI/FastCGI + C/Cpp

    http://www.cnblogs.com/skynet/p/4173450.html Nginx + CGI/FastCGI + C/Cpp 2014-12-19 11:05 by 吴秦, 197 ...

  7. Nginx + CGI/FastCGI + C/Cpp(编不过去,不搞了。。。)(Common Gateway Interface)

    Nginx + CGI/FastCGI + C/Cpp 文章目录 1.CGI 1.1.环境变量 1.2.标准输入 总结:CGI使外部程序与Web服务器之间交互成为可能.CGI程式运行在独立的进程中,并 ...

  8. Nginx运行FastCGI程序(ngx_http_fastcgi_module模块、fcgi库、spwan-fcgi进程管理器)

    一.什么是CGI 通用网关接口(Common Gateway Interface.CGI)描述了客户端和服务器程序之间传输数据的一种标准,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数 ...

  9. 让nginx支持php和path_info

    默认情况下,nginx是不支持php和path_info的,我们需要做些配置让它支持,关于nginx的其他配置信息不再复述,只来说下server中的设置. server{listen 80;serve ...

最新文章

  1. 中国信通院《新型智慧城市发展研究报告》
  2. cordova 发布 android release 签名打包
  3. 12v小型电机型号大全_电机型号参数大全,再不怕看不懂型号了!建议收藏
  4. 深度学习~卷积神经网络(CNN)概述
  5. hdu3697(贪心+暴力)
  6. 从手机App到网点交互请求的日志记录
  7. 浙江网信办处置44家违规网站 包含网易游戏、花瓣网等
  8. QueryWrapper 一些常用操作 or like in 大于 小于 操作
  9. zabbix系列(八)zabbix添加对web页面url的状态监控
  10. 奥威软件大数据bi_商业智能BI软件就是数据可视化工具吗?
  11. 线程间操作无效: 从不是创建控件“listBox1”的线程访问它
  12. python分类识别_Python构建图像分类识别器的方法
  13. 【verilog教程】第10篇:verilog代码规范
  14. 接口测试用例设计 - 精简版
  15. macbook安装linux分区,如何在MacBook Pro Retina上安装Linux
  16. 详细船舶信息爬虫教程:船讯网根据MMSI爬取对应船舶属性信息|附python爬虫代码
  17. 华硕win10键盘失灵_win10键盘失灵错乱的几种解决方法【图文】
  18. OpenCV——图像细化算法
  19. ads的项目下的文件全部消失不见了
  20. 一经开源就爆了!谷歌这个脚本工具注定要火

热门文章

  1. 安卓手机卡顿怎么解决_苹果手机卡顿反应慢怎么办
  2. 数字化转型时代,人人都是攀登者
  3. 数字货币引发的金融变革
  4. Win11右键菜单退回Win10
  5. 基于FileDisk介绍磁盘驱动程序
  6. 心法利器[42] | 润物细无声-残差网络
  7. 第55~56讲-find 方法与findNext方法
  8. 证书工具类(csr、cer)
  9. [VB.net][WinForm]Panel控件移动\鼠标拖动
  10. java正则表达式 中括号_Java正则表达式获取中括号之间的内容