如何在 PHP 中识别请求的页面
Posted
技术标签:
【中文标题】如何在 PHP 中识别请求的页面【英文标题】:How To Identify The Requested Page In PHP 【发布时间】:2010-11-02 01:48:20 【问题描述】:是否有任何简单的方法来识别最初处理请求的文件,忽略获取参数和处理(至少是基本的)映射,如 /
到 /index.php
?
理想情况下,我正在寻找类似于$_SERVER['REQUEST_URI']
的东西,除了它返回相同的值,而不管获取参数如何,并且该值是请求的文件,而不是 URI,也不是当前正在执行的文件 ($_SERVER['PHP_SELF']
) .换句话说,$_SERVER['REQUESTED_FILE']
什么的。我没见过这样的。它存在吗,还是我需要手动写一些东西?
更新 以下是一些与我希望结果配对的示例 URL:
example.com/mypage.php : /mypage.php
example.com/ : /index.php
example.com/foo/?hello=world : /foo/index.php
即使在包含的文件中,这些返回值也是 true。在回答之前先看看我的回答,我想我已经找到了我要找的东西。
【问题讨论】:
您能否更新您的问题并添加您正在寻找的假设示例?不清楚您是对请求 URL (example.org) 还是用于服务请求的文件 (/var/www/.../index.php) 感兴趣 【参考方案1】:我决定自己测试一下。 $_SERVER['SCRIPT_NAME']
变量提供了所请求文件的路径,即使它是一个索引文件,并且没有获取参数或其他任何内容。 PHP 文档指出这包含文件的路径,但它似乎是相对于文档根目录的,就像PHP_SELF
,但没有安全漏洞。
这是我用来测试的代码:https://gist.github.com/dimo414/5484870
请求example.com/?foo=bar
时的输出:
__FILE__: /var/www/index.php
PHP_SELF: /index.php
SCRIPT_NAME: /index.php
REQUEST_URI: /?foo=bar
parse_url(REQUEST_URI): /
__FILE__: /var/www/pathtest.php
PHP_SELF: /index.php
SCRIPT_NAME: /index.php
REQUEST_URI: /?foo=bar
parse_url(REQUEST_URI): /
以及请求example.com/index.php/<strong>XSS</strong>
时的输出:
__FILE__: /var/www/index.php
PHP_SELF: /index.php/XSS # note the XSS exploit (this is bold in browser)
SCRIPT_NAME: /index.php # No exploit here
REQUEST_URI: /index.php/%3Cstrong%3EXSS%3C/strong%3E
parse_url(REQUEST_URI): /index.php/%3Cstrong%3EXSS%3C/strong%3E
__FILE__: /var/www/pathtest.php
PHP_SELF: /index.php/XSS
SCRIPT_NAME: /index.php
REQUEST_URI: /index.php/%3Cstrong%3EXSS%3C/strong%3E
parse_url(REQUEST_URI): /index.php/%3Cstrong%3EXSS%3C/strong%3E
如您所见,$_SERVER['SCRIPT_NAME']
总是返回最初处理请求的文件,即 URL 中的文件,没有任何 XSS 风险。
【讨论】:
值得注意的是,如果你使用某种 MVC 或前端控制器方法,那么“SCRIPT_NAME”将返回提供包含的脚本,所以如果一切都通过 index.php 示例运行,这将返回- 在这种情况下 $_SERVER['REQUEST_URI'] 似乎可以解决问题。 @MatthewRiches 请注意,REQUEST_URI
的用途与 SCRIPT_NAME
不同 - 前者是用户请求的 URI,包括 GET 参数,其中 SCRIPT_NAME
故意不这样做,因为它是服务器。如果您在 MVC 库中工作,则应查看该库的文档以了解如何最好地识别实际请求的文件。【参考方案2】:
$_SERVER['PHP_SELF']
应该返回实际的脚本。但是有various methods。
我有一个更好的链接到所有各种与文件相关的环境变量的矩阵,但我找不到它。如果它出现,我会编辑。
编辑:我找到了a nice SO thread that details the differences between them。
【讨论】:
【参考方案3】:使用以下代码从请求的 URL 中获取文件名。
basename($_SERVER['URL']);
basename($_SERVER['REQUEST_URI']);
basename($_SERVER['SCRIPT_NAME']);
basename($_SERVER['SCRIPT_FILENAME']);
basename($_SERVER['REQUEST_URI']);
basename($_SERVER['PATH_TRANSLATED']);
basename($_SERVER['PHP_SELF']);
在嵌套的 if 条件中使用所有这些中的任何一个,这样您就不会错过任何文件名。
【讨论】:
这与问题无关。【参考方案4】:parse_url($_SERVER['REQUEST_URI'])
然后pathinfo($path)
获取请求的文件名
$_SERVER['PHP_SELF']
获取真实文件名
$_SERVER['SCRIPT_NAME']
获取真实文件名
【讨论】:
【参考方案5】:这是一个非常古老的问题,也不是很清楚。 我的理解是您想知道哪个页面正在发送请求 GET/POST。这可以通过以下方式实现:
$_SERVER['HTTP_REFERER']
现在,要获取实际的页面名称,可以这样写: = basename($_SERVER['HTTP_REFERER']);
这会解决你的顾虑。
【讨论】:
不,问题绝不是询问 HTTP 引荐来源网址。这将(当设置时)指示用户之前在哪个页面上将他们引至此页面。问题是询问当前正在请求的文件,并且接受的答案表明它是$_SERVER['SCRIPT_NAME']
。以上是关于如何在 PHP 中识别请求的页面的主要内容,如果未能解决你的问题,请参考以下文章