如何在 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 中识别请求的页面的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中识别服务器 IP 地址

如何使用 PHP 创建错误 404 页面?

Php高级知识 2

你如何在php中组织你的页面?

如何通过php的curl模拟ajax请求,获取其返回值

php 如何得到访问者在当前页面的停留时长?