PHP_SELF vs PATH_INFO vs SCRIPT_NAME vs REQUEST_URI

2022-08-30 07:15:51

我正在用CodeIgniter构建一个PHP应用程序。CodeIgniter 将所有请求发送到主控制器:。但是,我不喜欢在URI中看到。例如,将路由到 。我需要一种可靠的方法让脚本知道它的地址是什么,这样它就会知道如何处理导航。我已经按照CodeIgniter文档使用了。index.phpindex.phphttp://www.example.com/faq/whateverhttp://www.example.com/index.php/faq/whatevermod_rewrite

规则如下:

RewriteEngine on
RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L] 

通常,我会检查,但在这种情况下,它总是。我可以从 ,等处获取它,但我试图决定哪个最可靠。有谁知道(或知道在哪里可以找到)和 之间的真正区别?感谢您的帮助!php_selfindex.phpREQUEST_URIPATH_INFOPHP_SELFPATH_INFOSCRIPT_NAMEREQUEST_URI

注意:我不得不添加空格,因为SO看到了下划线,并且由于某种原因将其设置为斜体。

更新:修复了空格。


答案 1

这些变量之间差异的一些实际例子:
实施例1。仅当请求的 url 采用以下形式时,PHP_SELF才与SCRIPT_NAME不同:
http://example.com/test.php/foo/bar

[PHP_SELF] => /test.php/foo/bar
[SCRIPT_NAME] => /test.php

(这似乎是PATH_INFO包含合理信息时的唯一情况 [PATH_INFO] = > /foo/bar)注意:这在一些较旧的PHP版本中曾经有所不同(<= 5.0 ?

示例 2.REQUEST_URI与输入非空查询字符串时的SCRIPT_NAME不同:
http://example.com/test.php?foo=bar

[SCRIPT_NAME] => /test.php
[REQUEST_URI] => /test.php?foo=bar

示例 3.REQUEST_URI与服务器端重定向生效时的SCRIPT_NAME不同(例如,apache上的mod_rewrite):

http://example.com/test.php

[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /test2.php

示例 4.REQUEST_URI与使用脚本处理 HTTP 错误时SCRIPT_NAME不同。
使用 apache 指令 ErrorDocument 404 /404error.php
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

答案 2

PHP文档可以告诉你区别:

“PHP_SELF”

当前正在执行的脚本相对于文档根目录的文件名。例如,地址 http://example.com/test.php/foo.bar 的脚本中的 $_SERVER['PHP_SELF'] 将是 /test.php/foo.bar__FILE__常量包含当前(即包含的)文件的完整路径和文件名。如果 PHP 作为命令行处理器运行,则此变量包含自 PHP 4.3.0 起的脚本名称。以前它不可用。

“SCRIPT_NAME”

包含当前脚本的路径。这对于需要指向自己的页面很有用。__FILE__常量包含当前(即包含的)文件的完整路径和文件名。

“REQUEST_URI”

为了访问此页面而给出的URI;例如,“/index.html”。

PATH_INFO似乎没有记录在案...


推荐