繁体   English   中英

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

[英]PHP - Display a 404 Error without redirecting to another page

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

我不想像下面这样进行重定向(这会导致地址栏在地址栏中显示错误页面的链接):

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

相反,如果浏览器地址中的 URL 没有更改,页面看起来应该真的不存在。

在当前页面中包含错误页面并发送 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(未授权)。

您可以通过以下方式以编程方式实现 404(或任何其他 HTTP 响应代码)

header('HTTP/1.0 404 Not Found');
die;

根据我的经验,在不更改 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]

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

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

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

例如,如果此人访问了他/她不应该看到的受保护页面。 使用标头是最好的方法。 您的选择是回显元刷新或 javascript,但标头更清晰。 您可以显示类似You do not have permission to do that! 这在网络上很常见。 如果您不想重定向,您可以通过标头显示 404“假消息”。

如果您谈论的是某人到达 404 页面,一个不存在的文件,您唯一的选择是使用 .htaccess

你可以直接转到你的 404 页面吗

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

对于单个页面,这些都是重定向到 404 错误的很好的答案。 这是一个解决方案,可让您测试条件并重定向您网站上的任何脚本。

编写一个.htaccess文件,使用重写规则,并使用[QSA,NC,L]来维护页面位置和标题 post/get 参数...

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

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

$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,html 页面。 使用动态的,您可以...

  • 您的条件可以像您编写代码一样复杂:检查身份验证、检查永久重定向,也许您想自动使内容过期? 等等等等。
  • 在您的数据库中搜索explode('/', $_SERVER['PHP_SELF']) ,然后在标题“Maybe this is what you were looking for?”下显示这些匹配结果的列表。
  • 响应用户级事件:是否因为页面被移动而返回 404? 然后处理重定向。 它是 404 是因为版主删除了它并且它是用户的帖子吗? 告诉用户版主删除了他们的帖子。 等等等等。
  • 进行 API 调用、动态代码等等,可能性就在那里。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM