[translate]php_self vs path_info vs script_name vs request_uri

背景

php 的几个 $_SERVER 变量都有自己的应用场景的,但 manual 那里写的太抽象了,最后在 stackoverflow 那里看到,通过浅显的例子,生动的比较了 PHP_SELF、PATH_INFO、SCRIPT_NAME 和 REQUEST_URI 的不同之处,简单翻译在下面,算是 mark 下来。

正文

一些展示这些变量不同之处的实际例子:

1.PHP_SELF 跟 SCRIPT_NAME 只有在请求的 url 是如下格式的时候才会不同:

http://example.com/test.php/foo/bar
[PHP_SELF] =/test.php/foo/bar
[SCRIPT_NAME] =/test.php/

(看来 PATH_INFO 只有在这种在请求文件后再追加路径的情形下才发挥了自己作用,而这个时候 $_SERVER [‘PATH_INFO’] 才有值) 注意:在低于 5.0 版本的 php 中,这会有些许不同。

2. 当请求的链接中带有查询语句的时候,REQUEST_URI 和 SCRIPT_NAME 会不一样:

http://example.com/test.php/foo/bar
http://example.com/test.php?foo=bar
[SCRIPT_NAME] => /test.php
[REQUEST_URI] => /test.php?foo=bar
3. 当服务器重写规则起作用的时候 (比如我们开启了 APACHE 的 mod_rewrite 模块后),REQUEST_URI 和 SCRIPT_NAME 是不一样的:

http://example.com/test.php/foo/bar
http://example.com/test.php
[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /test2.php

4. 当用脚本处理 HTTP 错误的时候,REQUEST_URI 和 SCRIPT_NAME 会不一样。使用 Apache 命令 ErrorDocument 404 /404errror.php

http://example.com/test.php/foo/bar
http://example.com/test.php
[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /404error.php

在 IIS 服务器下,使用自定义的错误页
http://example.com/test.php
[SCRIPT_NAME] => /404error.php
[REQUEST_URI] => /404error.php?404;http://example.com/test.php

原文链接: 传送门

发表评论

电子邮件地址不会被公开。 必填项已用*标注