【问题标题】:Custom 404 page - PHP自定义 404 页面 - PHP
【发布时间】:2011-08-05 12:40:49
【问题描述】:

我有一个自定义 404 页面,除了我想在此页面上显示的消息之外,它工作正常。

我想让它说找不到页面的url,而是显示404页面的url。

这就是我所拥有的......

You were looking for <?php echo $_SERVER['REQUEST_URI'] ?>.

htaccess 文件包含以下行:ErrorDocument 404 /404/

【问题讨论】:

  • 你是如何设置错误页面的? (例如,您是使用 Apache 的 ErrorDocument 指令还是?)
  • 我有一个 htaccess 文件,其中包含以下行:ErrorDocument 404 /404/ - 并且 404 页面包含上面的行。
  • 当你得到这种行为时,你能从一个实例中发布<?php var_dump($_SERVER); ?> 的内容吗?我很困惑为什么这些方法都不起作用。我对 Apache 进行了一些试验,但无法产生 none 得到你想要的结果的情况。
  • @Simon143 - 感谢您的建议。看来我需要使用 DOCUMENT_URI。尽管正如您所说,我真的希望我的原始代码能够正常工作。奇怪!!

标签: php apache http-status-code-404 errordocument


【解决方案1】:

您需要改用$_SERVER['HTTP_REFERER'] - 这将是他们首先请求的地址。

这仅适用于问题中描述的确切情况 - 浏览器实际上已重定向到 404 页面。在这种情况下,$_SERVER['REQUEST_URI'] 包含 404 页面的 URI,而不是所描述的最初请求的页面。

在站点配置中使用 Apache 的 ErrorDocument 404 /handle404.php.htaccess 意味着 $_SERVER['REQUEST_URI'] 确实可以工作,但下面更新中的选项是更强大的解决方案。

更新:

显然$_SERVER['REDIRECT_URL'] 可能是一个更好的选择,不过搜索了一下。

对于这两种情况,正如下面评论者所提到的,请记住,任何标头都与 $_POST$_GET 和其他标头一样容易出现恶意内容,因此请在输出任何内容之前对其进行处理。

更新 2:

没有看到下面@Janoz 的帖子 - 他正确地提到了REDIRECT_URL

【讨论】:

  • 不保证会提供,因为它是从浏览器发送的 HTTP 标头。 (本质上,这个问题应该有一个有保证的服务器端解决方案。)
  • 别忘了做一些转义。从技术上讲,引用者是用户输入。
【解决方案2】:

从 php 页面的角度来看,这确实是请求 uri。显示错误页面由网络服务器完成。例如 Apache 将添加一些额外的服务器变量。 REDIRECT_URL 可能是您正在寻找的那个。

【讨论】:

  • 我以为这会起作用,但它没有......仍然显示404页面的URL(例如404.php)
【解决方案3】:

如果页面不存在,您会将他重定向到 404 页面吗?理想情况下,我会直接在未找到的页面上显示 404。这样,您不必重定向,并且可以正确使用 REQUEST_URI。而且您的 404 代码仍然可以集中!

【讨论】:

  • 我不重定向它们,我直接在找不到的页面上显示404。请参阅我对 htaccess 代码的原始帖子的评论
【解决方案4】:

使用 file_exists 检查您的用户正在寻找的文件是否存在。如果没有将它们重定向到自定义错误页面。

【讨论】:

    【解决方案5】:

    这个函数不是我写的,但它是我用来做同样事情的:

        function selfURL() {
        $s = empty($_SERVER["HTTPS"]) ? ''
            : ($_SERVER["HTTPS"] == "on") ? "s"
            : "";
        $protocol = strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/").$s;
        $port = ($_SERVER["SERVER_PORT"] == "80") ? ""
            : (":".$_SERVER["SERVER_PORT"]);
        return $protocol."://".$_SERVER['SERVER_NAME'].$port.$_SERVER['REQUEST_URI'];
    }
    function strleft($s1, $s2) {
        return substr($s1, 0, strpos($s1, $s2));
    }
    

    然后打印它:

    <?php print(selfURL()); ?>
    

    【讨论】:

      猜你喜欢
      • 2018-11-16
      • 2014-08-06
      • 2010-11-04
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      相关资源
      最近更新 更多