nginx下支持PATH_INFO的方法实例详解

本文实例分析了nginx下支持PATH_INFO的方法。分享给大家供大家参考,具体如下:

要想让nginx支持PATH_INFO,首先需要知道什么是pathinfo,为什么要用pathinfo?

pathinfo不是nginx的功能,pathinfo是php的功能。

php中有两个pathinfo,一个是环境变量$_SERVER['PATH_INFO'];另一个是pathinfo函数,pathinfo() 函数以数组的形式返回文件路径的信息;。

nginx能做的只是对$_SERVER['PATH_INFO]值的设置。

下面我们举例说明比较直观。先说php中两种pathinfo的作用,再说如何让nginx支持pathinfo。

php中的两个pathinfo

php中的pathinfo()

pathinfo()函数可以对输入的路径进行判断,以数组的形式返回文件路径的信息,数组包含以下元素。

[dirname]  路径的目录
[basename] 带后缀 文件名
[extension]  文件后缀
[filename]  不带后缀文件名(需php5.2以上版本)

例如

<?php
print_r(pathinfo("/nginx/test.txt"));
?>

输出

Array
(
  [dirname] => /nginx
  [basename] => test.txt
  [extension] => txt
  [filename] => test
)

php中的$_SERVER['PATH_INFO']

PHP中的全局变量$_SERVER['PATH_INFO'],PATH_INFO是一个CGI 1.1的标准,经常用来做为传参载体。

被很多系统用来优化url路径格式,最著名的如THINKPHP框架。

对于下面这个网址:

http://www.test.cn/index.php/test/my.html?c=index&m=search

我们可以得到 $_SERVER['PATH_INFO'] = '/test/my.html',而此时 $_SERVER['QUERY_STRING'] = 'c=index&m=search';

如果不借助高级方法,php中http://www.test.com/index.php?type=search 这样的URL很常见,大多数人可能会觉得不太美观而且对于搜索引擎也是非常不友好的(实际上有没有影响未知),因为现在的搜索引擎已经很智能了,可以收入带参数的后缀网页,不过大家出于整洁的考虑还是想希望能够重写URL,

下面是一段解析利用PATH_INFO的进行重写的非常简单的代码:

<?php
if(!isset($_SERVER['PATH_INFO'])) {
  $pathinfo = 'default';
} else {
  $pathinfo = explode('/', $_SERVER['PATH_INFO']);
}
if(is_array($pathinfo) && !empty($pathinfo)) {
  $page = $pathinfo[1];
} else {
  $page = 'default.php';
}
?>

有了以上认识我们就可以介入nginx对$_SERVER['PATH_INFO']支持的问题了。在这之前还要介绍一个php.ini中的配置参数cgi.fix_pathinfo,它是用来对设置cgi模式下为php是否提供绝对路径信息或PATH_INFO信息。没有这个参数之前PHP设置绝对路径PATH_TRANSLATED的值为SCRIPT_FILENAME,没有PATH_INFO值。设置这个参数为cgi.fix_pathinfo=1后,cgi设置完整的路径信息PATH_TRANSLATED的值为SCRIPT_FILENAME,并且设置PATH_INFO信息;如果设为cgi.fix_pathinfo=0则只设置绝对路径PATH_TRANSLATED的值为SCRIPT_FILENAME。cgi.fix_pathinfo的默认值是1。

nginx默认是不会设置PATH_INFO环境变量的的值,需要php使用cgi.fix_pathinfo=1来完成路径信息的获取,但同时会带来安全隐患,需要把cgi.fix_pathinfo=0设置为0,这样php就获取不到PATH_INFO信息,那些依赖PATH_INFO进行URL美化的程序就失效了。

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']的值进行设置,不需要另外配置。

本文永久地址:http://blog.it985.com/7768.html
本文出自 IT985博客 ,转载时请注明出处及相应链接。

希望本文所述对大家nginx服务器配置有所帮助。

(0)

相关推荐

  • Symfony2安装的方法(2种方法)

    本文详细讲述了Symfony2安装的方法.分享给大家供大家参考,具体如下: 一.Composer安装Symfony Composer安装Symfony方法在前面的文章<Symfony之十分钟入门>有介绍 二.Symfony Installer安装Symfony 这里来着重介绍第二种Symfony Installer安装Symfony的方法 1.安装Symfony Installer 控制台执行命令 [Sun@localhost html]$ curl -LsS http://symfony.c

  • 高性能PHP框架Symfony2经典入门教程

    Symfony2是一个基于PHP语言的Web开发框架,有着开发速度快.性能高等特点.本文以一个程序示例的实现过程详细叙述了Symfony2框架的配置与程序开发. 一.下载 首先是下载Symfony2,到 http://symfony.com/download或者本站下载http://www.jb51.net/codes/187833.html.本人以Ubuntu系统为例,采用.tgz的压缩包,解压源文件到/var/www目录中并执行: tar zxvf Symfony_Standard_Vend

  • Symfony页面的基本创建实例详解

    本文实例分析了Symfony页面的基本创建方法.分享给大家供大家参考.具体如下: 这里我们将会学习如何创建一个模块,这是组织页面的结构化元素.同时我们也会学习如何创创建一个分为一个动作也一个模板的页面,之所以分为动作与模板,是因为MVC模式.链接与表彰是基本的页面交互,我们将会学习如何在模板中插入这些元素并且在动作中进行处理. 创建一个模块框架 Symfony将页面组织为模块.在创建一个页面之前,我们需要创建一个模块,并且初始化为一个Symfony可以识别的文件结构的空壳. Symfony命令行

  • Symfony学习十分钟入门经典教程

    Symfony是一个强大的基于PHP的Web开发框架,在这里我们用十分钟的时间来做一个简单的增删改查的程序, 任何不熟悉Symfony的人都可以通过这个教程完成自己的第一个Symfony程序. 如果需要这个样例程序的全部源代码,可以访问 这里 ,或者通过下面的方式获取源代码: $git clone https://github.com/saharabear/symfony-sample.git 项目初始化 首先,需要你在自己的电脑中安装PHP环境并安装git.这方面的内容属于基础内容,网络上有大

  • 如何在symfony中导出为CSV文件中的数据

    开始: 复制代码 代码如下: public function executeRegistrantsToCsv(){ $id = $this->getRequestParameter('id'); $c = new Criteria(); $c->add(RegistrantPeer::EVENT_ID, $id); $c->add(RegistrantPeer::STATUS, 1); $this->aObjReg = RegistrantPeer::doSelect($c); $

  • PHP的Symfony和CodeIgniter框架的Nginx重写规则配置

    Symfony Symfony国外很流行的php框架,目前国内用的相对较少,但是一定会在国内火起来. nginx重写规则如下 server { server_name jb51.net www.jb51.net; root /data/site/www.jb51.net; location / { # try to serve file directly, fallback to rewrite try_files $uri @rewriteapp; } location @rewriteapp

  • Symfony生成二维码的方法

    本文实例讲述了Symfony生成二维码的方法.分享给大家供大家参考,具体如下: 现在网上能搜到很多关于使用PHP生成二维码的例子,主要是两种方法: 第一种:google开放api,如下: $urlToEncode="http://blog.it985.com"; generateQRfromGoogle($urlToEncode); function generateQRfromGoogle($chl, $widhtHeight = '150', $EC_level = 'L', $m

  • Symfony数据校验方法实例分析

    本文实例讲述了Symfony数据校验方法.分享给大家供大家参考.具体分析如下: 校验在web应用程序中是一个常见的任务.数据输入到表单需要被校验.数据在被写入数据库之前或者传入一个webservice时也需要被校验. Symfony2 配备了一个Validator 组件,它让校验工作变得简单易懂.该组件是基于JSR303 Bean校验规范.一个Java规范用在PHP中. 基本验证 理解校验的最好方法是看它的表现.首先,假设你已经创建了一个用于你应用程序某个地方的PHP对象. 复制代码 代码如下:

  • symfony表单与页面实现技巧

    本文实例讲述了symfony表单与页面实现技巧.分享给大家供大家参考.具体如下: symfony开发很简洁,但是功能的数量仍然很缺乏.现在是时候进行一些askeet站点与用户之间的交互了.而HTML交互的根本--除了起链接--就是表单了. 这里我们的目标是允许用户登陆,并在主页的问题列表中进行翻阅.这对于开发而言是很快的,并且可以让我们回忆起前面的内容. 登陆表单 在测试数据中存在用户,但是程序却没有办法来进行验证.下面我们要在程序的每一个页面添加一个登陆表单.打开全局的布局文件askeet/a

  • Symfony2在Nginx下的配置方法图文教程

    本文详细讲述了Symfony2在Nginx下的配置方法.分享给大家供大家参考,具体如下: 网上有很多关于symfony2在nginx下的配置文章,如果是小白,按照网上贴出来的配置文件配置,却怎么也不成功,我经过多次摸索,写下心得: 1. 首先开启Nginx的pathinfo 至于什么是pathinfo,可以参考文章<nginx下支持PATH_INFO的方法实例详解>,自行脑补.很多人按照教程配置的时候,会报500的错误,查报错日志也查不出来,八成就是没有开启pathinfo. 如果你的主机上安

  • Symfony2 session用法实例分析

    本文实例分析了Symfony2 session用法.分享给大家供大家参考,具体如下: Symfony自带有session的方法,以前老版本2.2及以前的session用法是 $session = $this->getRequest()->getSession(); $session->set('foo', 'bar'); $foobar = $session->get('foobar'); 后来Symfony2.3开始$this->getRequest()方法被废弃,sess

随机推荐