【问题标题】:Get the URL of a file included by PHP获取 PHP 包含的文件的 URL
【发布时间】:2011-11-07 13:42:46
【问题描述】:

我有一个类包含在不同目录中的一堆其他脚本中。有时,此类需要发出重定向到位于同一目录中的另一个文件。我无法让它以一致的方式工作。

例如:

// file.php
require('../class/include.php');

// include.php
if(/* some condition */) {
    $mydir = '...'; // should be '../class' in this example
    header("Location: $mydir/setup.php");
    die();
}

我已经完成了以下工作并取得了可喜的结果,但它似乎并不总是有效,我不确定我是否使用了错误的服务器变量,或者配置对于不起作用的实例是否不正确.

$len = strlen($_SERVER['DOCUMENT_ROOT']);
$mydir = str_replace('\\', '/', __FILE__); // switch slashes for Windows systems
$mydir = substr($mydir, $len, strrpos($mydir, '/') - $len + 1);

注意我想要 URL,路径没有帮助,因为我无法重定向到 /var/wwwroot/some/directoryC:\domains\mydomain\some\directory

这可能更像是$_SERVER['DOCUMENT_ROOT'] 的问题。请注意,我从__FILE__ 中剥离了$_SERVER['DOCUMENT_ROOT'] 的长度以获取Web 可访问部分。

编辑

为了简单一点,有没有办法为包含的文件而不是父文件获取 $_SERVER['REQUEST_URI']$_SERVER['PHP_SELF'] 的等价物?

【问题讨论】:

  • 使用DIRECTORY_SEPARATOR PHP 常量代替在 Windows 中切换斜线。 php.net/manual/en/dir.constants.php
  • 不知道这个常数。谢谢。
  • 关于如何不规划文件布局以及为什么对象封装是个好主意的对象课程。

标签: php redirect


【解决方案1】:

您可以使用dirname

$mydir = dirname(__FILE__);

【讨论】:

  • 真正要做的就是从__FILE__ 中删除“include.php”。我需要重定向到的目录。这就是为什么(在我上面的示例中),我从 __FILE__ 的开头删除了 $_SERVER['DOCUMENT_ROOT'] 的长度,但我遇到了几个 PHP 配置,但它不起作用。
【解决方案2】:

您的重定向不应指向这样的文件,而应指向 URL。

如果您使用相对 URL,则文件所在的位置无关紧要

例如:如果“setup.php”和你现在在同一个目录中

header("位置:setup.php");

如果它位于当前位置的子目录中,例如 setup/setup.php

header("位置:setup/setup.php");

请记住,这会将 URL 发送到浏览器,然后浏览器将从新位置提取数据,因此只需使用相对 URL,然后文件路径的整个问题就会消失。

【讨论】:

  • 是的,这很好,但即使创建相对 URL 也是问题,因为文件是从“未知”源包含的(意味着文件只包含在内,从不直接访问)并且目录可能在我需要重定向到的位置上方或下方有许多目录。
【解决方案3】:

您需要使用 URL 来执行重定向,而不是文件路径,因此请尝试以下操作。

$base_url = 'http://example.org';
$path = substr($_SERVER['REQUEST_URI'], 0, strrpos($_SERVER['REQUEST_URI'], '/'));
$file = 'example.php';
header("Location: {$base_url}/{$path}/{$file}";
exit;

$base_url 可以来自 $_SERVER['SERVER_NAME'],以获得更自动化的系统。

不要忘记在发出 Location HTTP 标头时,您应该指定一个完整的 URL,而不是像您在问题中那样的相对 URL。见:RFC 1945 Hypertext Transfer Protocol -- HTTP/1.0: 10.11 Location

【讨论】:

  • 除了,$_SERVER['REQUEST_URI'] 用于父脚本,而不是包含的脚本。本质上,我需要 REQUEST_URI 用于包含的脚本,它可能与父脚本相距许多目录。
  • 您需要采用适当的路由机制来跟踪所有这些并允许您生成路由。文件路径不直接转换为 URL。
【解决方案4】:

我所做的似乎确实有效,问题似乎是$_SERVER['DOCUMENT_ROOT'] 不可靠且不一定正确。找到了一个更好的方法来获取文档根here(看第二个答案)。

$docroot = realpath((getenv('DOCUMENT_ROOT') && ereg('^'.preg_quote(realpath(getenv('DOCUMENT_ROOT'))), realpath(__FILE__))) ? getenv('DOCUMENT_ROOT') : str_replace(dirname(@$_SERVER['PHP_SELF']), '', str_replace(DIRECTORY_SEPARATOR, '/', dirname(__FILE__))));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2016-10-17
    • 2015-10-19
    相关资源
    最近更新 更多