欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

PHP中的$_SERVER['PATH_INFO']

shiping1 的头像

 

'PATH_INFO'
包含由客户端提供的、跟在真实脚本名称之后并且在查询语句(query string)之前的路径信息,如果存在的话。例如,如果当前脚本是通过 URL http://www.example.com/php/path_info.php/some/stuff?foo=bar 被访问,那么 $_SERVER['PATH_INFO'] 将包含 /some/stuff

来自 http://php.net/manual/zh/reserved.variables.server.php
php $_SERVER['PATH_INFO'] 得不到值
 
php $_SERVER['PATH_INFO'] 得不到值是什么原因?php的配置出现问题了吗?
在PHP5中,register global由默认的on改为off,但用 $_SERVER['PATH_INFO']一定能得到值。我想可能是别的地方错了。你把这地方的代码贴上来看一下。

参考资料: http://blog.sina.com.cn/s/blog_4d3a41f40100ilkk.html

自 http://zhidao.baidu.com/link?url=GLlWgQu5HyiZ5Jn4StC2oC7huRVGz4Z1vUR20Uvui8ccpIg8OnfEitJ1QlGqjcy7oOZmfMqMQmNs-BD3VR8h-q



$ _ SERVER ['PATH_INFO']和$ _ SERVER ['ORIG_PATH_INFO']在PHP



什么是它们之间的区别?如何使用它们。的print_r($ _ SERVER) 没有结果 $ _ SERVER ['PATH_INFO']和$ _ SERVER ['ORIG_PATH_INFO']。为什么?如何启用它。我已经阅读对他们的PHP手册,但还是不理解他们。谢谢

正确答案

PATH_INFO如果你调用一个PHP脚本这样的变量只存在:

HTTP //www.example.com/phpinfo.php/HELLO_THERE

它仅仅是/ HELLO_THERE后部分的.php脚本。如果你不喜欢调用该URL,不会有一个$ _ SERVER [“PATH_INFO”]环境变量。

PORIG_前缀是有点少见。PATH_INFO是一个标准的CGI环境变量,不应该作为前缀。你在哪里看的?(有大约PHP3 / PHP4一些问题,如果你通过的cgi-bin /调用PHP解释器-但几乎没有人今天这样的设置。)

供参考:http://www.ietf.org/rfc/rfc3875

$_SERVER['PATH_INFO'] and $_SERVER['ORIG_PATH_INFO'] in php


what's the difference between them? how to use them. i print_r($_SERVER). there is no result of$_SERVER['PATH_INFO'] and $_SERVER['ORIG_PATH_INFO'] .why? how to enable it.i have read the php manual on them, but still don't understand them. thank you

正确答案
The PATH_INFO variable is only present if you invoke a PHP script like this:

http://www.example.com/phpinfo.php/HELLO_THERE

It's only the /HELLO_THERE part after the .php script. If you don't invoke the URL like that, there won't be a $_SERVER["PATH_INFO"] environment variable.

The PORIG_ prefix is somewhat uncommon. PATH_INFO is a standard CGI-environment variable, and should never be prefixed. Where did you read that? (There were some issues around PHP3/PHP4 if you invoked the PHP interpreter via cgi-bin/ - but hardly anyone has such setups today.)

For reference: http://www.ietf.org/rfc/rfc3875

正确答案


来自 http://stackoverflow.com/questions/5629683/serverpath-info-and-serverorig-path-info-in-php







PHP中的全局变量$_SERVER['PATH_INFO']是一个很有用的参数,众多的CMS系统在美化自己的URL的时候,都用到了这个参数。

对于下面这个网址:

http://www.test.com/index.php/foo/bar.html?c=index&m=search

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

通 常,我们最初开始PHP程序编写的时候,都会使用诸如: http://www.test.com/index.php?c=search&m=main 这样的URL,这种URL不仅看起来非常奇怪,而且对于搜索引擎也是非常不友好的。很多搜索引擎收录的时候,都会忽略Query String之后的内容,google虽然不会忽略Query String,但是对于其他不含Query String的页面,会给于比较高的PR值。

下面是一段解析PATH_INFO的非常简单的代码:

<?php

if!isset$_SERVER['PATH_INFO'){
    
$pathinfo = 'default';
}
else{
    
$pathinfo =  explode('/', $_SERVER['PATH_INFO']);
}


ifis_array($pathinfoAND !empty($pathinfo ){
    
$page = $pathinfo[1];
}
else{
    
$page = 'a.php';
}


require "$page.php";

?>
来自 http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/09/13/2175071.html
http://www.cnblogs.com/cocowool/archive/2009/09/17/1568679.html
http://blog.sina.com.cn/s/blog_4d3a41f40100ilkk.html
http://blog.csdn.net/bingqingsuimeng/article/details/20380329

关于$_SERVER['PATH_INFO']打印不出的原因

打印不出来是空值还是报错啊?undefined index?

 

 
 
--- 共有 2 条评论 ---
  • 绿水本无忧回复 @ffvsnn520 : 去apache下面开启PATHINFO,Options Indexes FollowSymLinks AcceptPathInfo On 下面梦想岛说的对,__FILE__是首选 (11个月前)  
     
  • ffvsnn520没有这个变量.undefined (11个月前)  

来自 http://www.oschina.net/question/1269003_232928?_t_t_t=0.7445128867402673



如果你希望你的php可以使用$_SERVER[PATH_INFO]我们需要让Apache支持pathinfo才可以了,当然大部份apache默认就是支持pathinfo的哦。
最后总结测试环境:

Ubuntu Server 14.04

PHP Version 5.5.9-1ubuntu4

Apache/2.4.7 (Ubuntu)


PATH_INFO是服务器状态中的一个参数,通过$_SERVER['PATH_INFO']可以查看内容。$_SERVER数组中除了PATH_INFO外,还有非常多的数据,比如REQUEST_URI包含了更多的信息。

还有容易混淆的概念:pathinfo指的是PHP4(4.0.3)的一个功能,用于返回一个文件的路径信息。

Apache默认支持PATH_INFO功能,网上的很多教程不是需要修改apache的配置文件,就是要修改php的配置文件,其实完全不用修改任何文件,可以采用以下两种方式来验证PATH_INFO功能。

方式一:原生代码测试
在一个全新的系统上,比如新建一个Ubuntu 14.04 Server虚拟机,仅安装OpenSSH和LAMP软件包。

在Apache的主路径/var/www/html目录下新建测试文件pathinfo.php,内容为

<?php
 echo $_SERVER['PATH_INFO'];
?>
假设虚拟机的IP是192.168.1.106,访问http://192.168.1.106/pathinfo.php,会得到一个空白的页面。因为这个URL没有包含PATH_INFO信息。

更换网址测试http://192.168.1.106/pathinfo.php/year/2014/,页面上会显示/year/2014/,说明可以识别PATH_INFO信息。

方法二:用ThinkPHP测试
很多的PHP框架都需要获取PATH_INFO的值,以ThinkPHP为例,基本的步骤是:

下载最新的ThinkPHP到/var/www/html/目录,并解压,修改文件的权限为www-data
访问网址http://192.168.1.106/index.php,会自动生成Application下的文件列表
编辑文件Application/Home/Controller/IndexController.class.php,内容为
<?php
namespace HomeController;
use ThinkController;
class IndexController extends Controller {
    public function index(){
        $this->show('Hi,All','utf-8');
    }
    public function test(){
        $this->show('test');
    }
}
当访问http://192.168.1.106/index.php的时候,本质上是访问了http://192.168.1.106/index.php/Home/Index/index,如果后面这个长的可以访问,说明PATH_INFO是正常的。

如果存在异常,ThinkPHP可以能报错为无法加载模块/控制器或非法操作,可以通过访问test方法来验证。

输入网址http://192.168.1.106/index.php/Home/Index/test测试,页面会正常显示test

补充:Apache2.2.22开启PathInfo模式支持

在配置文件中加入

<Files *.php>

AcceptPathInfo On

</Files>

这样 Apache 就可以支持针对 php 文件的 PathInfo 了。
于是,小柒又充满希望的试了一下,可惜,还是没有成功。
我想,这PathInfo跟URL有关,那会不会是因为Apache服务器没有开启mod_rewrite模块的关系呢?于是,我在Apache的配置文件(Apache安装目录的conf文件夹下的httpd.conf文件)里找到:
#LoadModule rewrite_module modules/mod_rewrite.so
将前面的#去掉,改为:
LoadModule rewrite_module modules/mod_rewrite.so
保存,重启服务器后,项目终于可以使用PathInfo模式访问了

来自 http://www.111cn.net/phper/php-cy/62832.htm

 

为什么我打印不出来$_SERVER['PATH_INFO']呢


url 不是 PATH_INFO 形式的时候
$_SERVER['PATH_INFO'] 不存在

$_SERVER 是超全局数组,并不表示他的每一项都存在
比如 $_GET、$_POST 不都是有条件有值的吗

包含由客户端提供的、跟在真实脚本名称之后并且在查询语句(query string)之前的路径信息,如果存在的话。例如,如果当前脚本是通过 URL http://www.example.com/php/path_info.php/some/stuff?foo=bar 被访问,那么 $_SERVER['PATH_INFO'] 将包含 /some/stuff。 

来自 
http://bbs.csdn.net/topics/391040494


 

普通分类: