PHP - 显示404错误而不重定向到另一个页面

时间:2012-06-21 11:57:07

标签: php custom-error-pages

如果用户到达存在的页面但我不希望他/她看到,我想显示404错误。

我不想做重定向(这会导致地址栏在地址栏中显示错误页面的链接),如下所示:

if ($this_page_should_not_be_seen)
   header("Location: err.php?e=404");

相反,如果页面确实不存在,那么浏览器地址中的URL就不会改变。

6 个答案:

答案 0 :(得分:25)

在当前页面中包含错误页面并发送404错误状态代码:

<?php
if ($nobody_should_ever_be_here) {
  header('HTTP/1.1 404 Not Found'); //This may be put inside err.php instead
  $_GET['e'] = 404; //Set the variable for the error code (you cannot have a
                    // querystring in an include directive).
  include 'err.php';
  exit; //Do not do any more work in this script.
}
?>

请注意,如果永远不会看到该页面,则应使用此选项。未授权访问的更好状态代码(如果某些登录用户应该看到该页面)是403(未授权)。

答案 1 :(得分:4)

您可以使用

以编程方式实现404(或任何其他HTTP响应代码)
header('HTTP/1.0 404 Not Found');
die;

答案 2 :(得分:3)

根据我的经验,在不更改URL的情况下显示404错误文档的最佳方法是在apaches .htaccess文件中定义错误文档:

RewriteEngine on
RewriteBase /

# Defines 404 error pages content:
ErrorDocument 404 /my_root/errors/404.html

# for all invalid links (non existing files):
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* - [L,R=404]

# for some valid links (existing files to be un-accessible):
RewriteCond %{THE_REQUEST} ^.*some_file.php.*$ [NC]
RewriteRule .* - [L,R=404]

答案 3 :(得分:1)

你写的东西让我们很难理解。

  

我想将任何传入的用户重定向到404错误页面,如果他/她   到达我不希望他/她到达的页面。

那么,一个人到达一个存在的页面?

如果该人到达例如他/她不被禁止看到的受保护页面。使用标题是最好的方法。您的选择是回显元刷新或javascript,但标题更清晰。您可以显示类似You do not have permission to do that!的内容,这在网络上非常常见。如果您不想重定向,可以通过标题显示404“假邮件”。

如果您正在谈论有人到达404页面,一个不存在的文件,您只能选择使用.htaccess

答案 4 :(得分:1)

您可以直接访问您的404页面,如

标题('位置:http://www.website.com/errors/404.php');

答案 5 :(得分:0)

这些都是将404错误重定向到单个页面的绝佳答案。这是一个解决方案,可让您测试条件并重定向网站上任何脚本的。< / em>

编写带有重写规则的.htaccess文件,并使用[QSA,NC,L]维护页面位置和标题post / get自变量...

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,NC,L]

这将导致每个页面重定向到./index.php(如果您已经在使用index.php,请随意重命名)。该URL将不会更改。然后,在index.php中检查某些条件,如果通过,则包含指示脚本的$_SERVER变量,否则,执行自定义404。这意味着您可以简单地控制{{1}中的异常处理}与...

index.php

这也使您可以做很多其他事情!忘记静态的404.html页面,有了动态的页面,您可以...

  • 您的情况可能与您编写的代码一样复杂:检查身份验证,检查永久重定向,或者您想自动使内容过期?等等。
  • 在数据库中搜索$someNon404Condition = file_exists($_SERVER['PHP_SELF']); if ($someNon404Condition) { include($_SERVER['PHP_SELF']); // do the stuff } else { print("404! Why are you trying to access " . $_SERVER['PHP_SELF'] . "?"); } ,然后在标题“也许这就是您想要的?”下显示匹配结果的列表。
  • 响应用户级事件:是因为页面已移动,所以是404吗?然后处理重定向。是否是404,因为主持人删除了它,并且是用户的帖子?告诉用户版主删除了他们的帖子。等等。
  • 进行API调用,动态代码等,一切皆有可能。