欢迎各位兄弟 发布技术文章
这里的技术是共享的
在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
的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
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]我们需要让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