我有一个自定义的404页面,除了我想要在页面上显示的信息之外,其他都正常工作。
我希望它能够显示无法找到的页面的URL,但实际上它显示了404页面的URL。
这是我的代码...
您正在查找 <?php echo $ _SERVER ['REQUEST_URI']?>
htaccess文件包含以下行:ErrorDocument 404 /404/
我有一个自定义的404页面,除了我想要在页面上显示的信息之外,其他都正常工作。
我希望它能够显示无法找到的页面的URL,但实际上它显示了404页面的URL。
这是我的代码...
您正在查找 <?php echo $ _SERVER ['REQUEST_URI']?>
htaccess文件包含以下行:ErrorDocument 404 /404/
您需要使用$_SERVER ['HTTP_REFERER']
代替-那将是他们最初请求的地址。
这仅在问题中描述的确切情况下有效-即浏览器实际上已经被重定向到404页面。 在这种情况下,$_SERVER['REQUEST_URI']
包含404页面的URI,而不是原始请求的页面。
在网站配置或.htaccess
中使用Apache的ErrorDocument 404 /handle404.php
将意味着$_SERVER['REQUEST_URI']
实际上可以工作,但更健壮的解决方案是下面更新中提供的选项。
显然,$_SERVER ['REDIRECT_URL']
可能是更好的选择,经过一番搜索后得出。
对于两种情况,请注意像$_POST
、$_GET
和其他内容一样,任何标头都同样容易受到恶意内容的攻击,因此在输出内容之前请先处理它们。
没有看到下面@Janoz的帖子-他正确地提到了REDIRECT_URL
。
从php页面的角度来看,那确实是请求uri。显示错误页面是由web服务器完成的。例如,Apache将添加一些额外的服务器变量。REDIRECT_URL可能是您要查找的变量。
我没有编写这个函数,但这是我用来做同样事情的方法:
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()); ?>
ErrorDocument 404 /404/
- 而404页面包含了上述行。 - Tom<?php var_dump($_SERVER); ?>
的内容?我很困惑为什么这些方法都不起作用。我尝试了一下 Apache,却无法产生一个完全不得到想要结果的情况。 - Simon