我正在 CodeIgniter 中构建一个 PHP 应用程序。 CodeIgniter 将所有请求发送到主 Controller :index.php
。但是,我不喜欢在 URI 中看到 index.php
。例如,http://www.example.com/faq/whatever
将路由到 http://www.example.com/index.php/faq/whatever
.我需要一种可靠的方法让脚本知道它的地址是什么,这样它就会知道如何处理导航。根据 CodeIgniter 文档,我使用了 mod_rewrite
。
规则如下:
RewriteEngine on
RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
通常,我只会检查 php_self
,但在这种情况下,它始终是 index.php
。我可以从 REQUEST_URI
、PATH_INFO
等中获取它,但我正在尝试确定哪个最可靠。有谁知道(或知道在哪里可以找到)PHP_SELF
、PATH_INFO
、SCRIPT_NAME
和 REQUEST_URI
之间的真正区别?感谢您的帮助!
注意:我必须添加空格,因为 SO 会看到下划线,并且出于某种原因将其设为斜体。
更新:修正了空格。
最佳答案
这些变量之间差异的一些实际例子:
示例 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 包含敏感信息的唯一情况 [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。 当服务器端重定向生效时(例如 apache 上的 mod_rewrite),REQUEST_URI 与 SCRIPT_NAME 不同:
[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /test2.php
示例 4。
在使用脚本处理 HTTP 错误时,REQUEST_URI 与 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
关于http - PHP_SELF vs PATH_INFO vs SCRIPT_NAME vs REQUEST_URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/279966/