【问题标题】:How To Identify The Requested Page In PHP如何在 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) 感兴趣

标签: 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】:
    1. parse_url($_SERVER['REQUEST_URI']) 然后pathinfo($path) 获取请求的文件名
    2. $_SERVER['PHP_SELF'] 获取真实文件名
    3. $_SERVER['SCRIPT_NAME'] 获取真实文件名

    【讨论】:

      【解决方案5】:

      这是一个非常古老的问题,也不是很清楚。 我的理解是您想知道哪个页面正在发送请求 GET/POST。这可以通过以下方式实现:

      $_SERVER['HTTP_REFERER']

      现在,要获取实际的页面名称,可以这样写: = basename($_SERVER['HTTP_REFERER']);

      这会解决你的顾虑。

      【讨论】:

      • 不,问题绝不是询问 HTTP 引荐来源网址。这将(当设置时)指示用户之前在哪个页面上将他们引至此页面。问题是询问当前正在请求的文件,并且接受的答案表明它是$_SERVER['SCRIPT_NAME']
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多