提问人:Eli 提问时间:11/11/2008 最后编辑:imlouisrussellEli 更新时间:6/26/2023 访问量:87174
PHP_SELF vs PATH_INFO vs SCRIPT_NAME vs REQUEST_URI
PHP_SELF vs PATH_INFO vs SCRIPT_NAME vs REQUEST_URI
问:
我正在 CodeIgniter 中构建一个 PHP 应用程序。CodeIgniter 将所有请求发送到主控制器:。但是,我不喜欢在 URI 中看到。例如,将路由到 。我需要一种可靠的方法来让脚本知道它的地址是什么,这样它就会知道如何处理导航。我已经按照 CodeIgniter 文档使用了 。index.php
index.php
http://www.example.com/faq/whatever
http://www.example.com/index.php/faq/whatever
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 会看到下划线,并且出于某种原因将其设为斜体。
更新:修复了空格。
答:
就我个人而言,我使用它,因为它引用了输入的 URI,而不是服务器光盘上的位置。$REQUEST_URI
评论
您可能需要查看 URI 类并使用 $this->uri->uri_string()
返回包含完整 URI 的字符串。
例如,如果这是您的完整网址:
http://example.com/index.php/news/local/345
该函数将返回以下内容:
/news/local/345
或者,您可以利用这些段来向下钻取特定区域,而不必提出解析/正则表达式值
评论
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”
包含客户端提供的任何路径名信息,该路径名位于实际脚本文件名之后,但在查询字符串之前(如果可用)。例如,如果当前脚本是通过 URI http://www.example.com/php/path_info.php/some/stuff?foo=bar 访问的,则 $_SERVER['PATH_INFO'] 将包含 /some/stuff。
评论
这些变量之间差异的一些实际示例:
示例 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. REQUEST_URI与服务器端重定向生效时SCRIPT_NAME不同(例如,在 Apache 上mod_rewrite):
[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
评论
/
SCRIPT_NAME
备份一秒钟,你一开始就采取了错误的方法。为什么不这样做
RewriteEngine on
RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt)
RewriteRule ^(.*)$ /index.php?url=$1 [L]
相反?然后用$_GET['url'];
评论
QSA
url
PATH_INFO
仅在使用 HTTecess 时可用,如下所示:
示例 1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]
保持不变
[SCRIPT_NAME] => /index.php
根
[PHP_SELF] => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
[REQUEST_URI] => /
[QUERY_STRING] =>
路径
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /test
[QUERY_STRING] =>
查询字符串
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /test?123
[QUERY_STRING] => 123
示例 2
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]
保持不变
[SCRIPT_NAME] => /index.php
[PHP_SELF] => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
根
[REQUEST_URI] => /
[QUERY_STRING] =>
路径
[REQUEST_URI] => /test
[QUERY_STRING] => url=test
查询字符串
[REQUEST_URI] => /test?123
[QUERY_STRING] => url=test&123
示例 3
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(([a-z]{2})|(([a-z]{2})/)?(.*))$ index.php/$5 [NC,L,E=LANGUAGE:$2$4]
或
RewriteRule ^([a-z]{2})(/(.*))?$ $3 [NC,L,E=LANGUAGE:$1]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]
保持不变
[SCRIPT_NAME] => /index.php
根
[PHP_SELF] => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
[REQUEST_URI] => /
[QUERY_STRING] =>
[REDIRECT_LANGUAGE] IS NOT AVAILABLE
路径
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /test
[QUERY_STRING] =>
[REDIRECT_LANGUAGE] =>
语言
[PHP_SELF] => /index.php/
[PATH_INFO] => /
[REQUEST_URI] => /en
[QUERY_STRING] =>
[REDIRECT_LANGUAGE] => en
语言路径
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /en/test
[REDIRECT_LANGUAGE] => en
语言查询字符串
[PHP_SELF] => /index.php/test
[PATH_INFO] => /test
[REQUEST_URI] => /en/test?123
[QUERY_STRING] => 123
[REDIRECT_LANGUAGE] => en
评论
PHP 路径
= Web 路径,请求的 URI
= Web 路径,请求的文件 + 路径信息
= Web 路径,请求的文件
= 文件路径,请求的文件
= 文件路径,当前文件 $_SERVER['REQUEST_URI']
$_SERVER['PHP_SELF']
$_SERVER['SCRIPT_NAME']
$_SERVER['SCRIPT_FILENAME']
__FILE__
哪里
- 文件路径是别名解析后的系统文件路径,如
/var/www/index.php
- Web 路径是类似于 from 的服务器文档路径,甚至可能与任何文件都不匹配
/index.php
http://foo.com/index.php
- 当前文件是指包含的脚本文件,而不是包含它的任何脚本
- 请求的文件是指包含脚本文件,而不是包含的文件
- URI 是 HTTP 请求,例如 ,在任何 URL 重写之前
/index.php?foo=bar
- 路径信息是位于脚本名称之后但查询字符串之前的任何额外 Apache 数据
操作顺序
- 客户端向服务器发送 HTTP 请求
REQUEST_URI
- 服务器从 .htaccess 文件等执行任何 URL 重写,以获取
PHP_SELF
- 服务器分为
PHP_SELF
SCRIPT_FILENAME
+PATH_INFO
- 服务器执行别名解析,并将整个 url 路径转换为要获取的系统文件路径
SCRIPT_FILENAME
- 生成的脚本文件可以包括其他脚本文件,其中引用当前文件的路径
__FILE__
评论
$_SERVER['SCRIPT_NAME']
$_SERVER['PHP_SELF']
$_SERVER['PHP_SELF']
奥丁的回答几乎没有什么可补充的。我只是想提供一个完整的示例,从HTTP请求到文件系统上的实际文件,以说明URL重写和别名的影响。在文件系统上,脚本是/var/www/test/php/script.php
<?php
include ("script_included.php")
?>
在哪里/var/www/test/php/script_included.php
<?php
echo "REQUEST_URI: " . $_SERVER['REQUEST_URI'] . "<br>";
echo "PHP_SELF: " . $_SERVER['PHP_SELF'] . "<br>";
echo "QUERY_STRING: " . $_SERVER['QUERY_STRING'] . "<br>";
echo "SCRIPT_NAME: " . $_SERVER['SCRIPT_NAME'] . "<br>";
echo "PATH_INFO: " . $_SERVER['PATH_INFO'] . "<br>";
echo "SCRIPT_FILENAME: " . $_SERVER['SCRIPT_FILENAME'] . "<br>";
echo "__FILE__ : " . __FILE__ . "<br>";
?>
并且是/var/www/test/.htaccess
RewriteEngine On
RewriteRule before_rewrite/script.php/path/(.*) after_rewrite/script.php/path/$1
并且 Apache 配置文件包含别名
Alias /test/after_rewrite/ /var/www/test/php/
HTTP 请求是
www.example.com/test/before_rewrite/script.php/path/info?q=helloword
输出将是
REQUEST_URI: /test/before_rewrite/script.php/path/info?q=helloword
PHP_SELF: /test/after_rewrite/script.php/path/info
QUERY_STRING: q=helloword
SCRIPT_NAME: /test/after_rewrite/script.php
PATH_INFO: /path/info
SCRIPT_FILENAME: /var/www/test/php/script.php
__FILE__ : /var/www/test/php/script_included.php
以下内容始终成立
PHP_SELF = SCRIPT_NAME + PATH_INFO = full url path between domain and query string.
如果没有 mod_rewrite、mod_dir、ErrorDocument 重写或任何形式的 URL 重写,我们也有
REQUEST_URI = PHP_SELF + ? + QUERY_STRING
别名影响系统文件路径,而不是 URL 路径,这些路径在之前定义 - 请参阅下面的例外情况。别名可能使用整个 URL 路径,包括 .和 之间可能根本没有联系。SCRIPT_FILENAME
__FILE__
PATH_INFO
SCRIPT_NAME
SCRIPT_FILENAME
在定义 URL 路径时未解析别名并不完全准确,因为别名被认为是搜索文件系统的,我们从 Oin 回答中的示例 4 中知道,搜索文件系统以确定文件是否存在,但这仅在未找到文件时才相关。同样,mod_dir调用mod_alias来搜索文件系统,但这仅在您具有别名(例如)且请求 uri 是目录时才相关。[PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO]
Alias \index.php \var\www\index.php
评论
如果你忘记了哪些变量做了什么,你可以编写一个使用 phpinfo() 的小脚本,然后从带有查询字符串的 URL 调用它。由于服务器软件安装会显示 PHP 返回的变量,因此检查计算机的输出始终是一个好主意,以防服务器配置文件的重写导致与预期不同的结果。将其保存为:_inf0.php
<?php
$my_ip = '0.0.0.0';
if($_SERVER['REMOTE_ADDR']==$my_ip){
phpinfo();
} else {
//something
}
然后你会打电话给/_inf0.php?q=500
简单易行的简单答案:
假设
之后会有两种可能性:
1-查询字符串,如
2-更多路径信息,如scheme://host/path/script.php
script.php
scheme://host/path/script.php?qs=a
scheme://host/path/script.php/more/path
现在我们有一个非常简单的规则:
财产 | 包括什么 | 例如:http://localhost/dashboard/paln5/st1.php/a/b?c=d |
---|---|---|
REQUEST_URI | 之后的所有内容都包括在内 | /dashboard/paln5/st1.php/a/b?c=d |
PHP_SELF | 只是包含更多路径 | /dashboard/paln5/st1.php/a/b |
SCRIPT_NAME | 之后不包含任何内容 | /dashboard/paln5/st1.php |
评论