模拟403错误页面


70

我知道您可以发送一个标头,告诉浏览器禁止此页面,例如:

header('HTTP/1.0 403 Forbidden');

但是,如何显示在服务器上为此类错误创建的自定义错误页面呢?

默认情况下,仅发送标题会显示白页,但我记得有一阵子回读,您可以使用客户错误页面。有人知道吗

Answers:


25

更改标题后,包括自定义错误页面。


我也尝试过,但是没有呈现出这样的内容:<!-#echo var =“ REDIRECT_STATUS”->
NightHawk

因此,在进行了更多搜索之后,没有找到其他任何东西,我选择包括该页面,并只将SSI命令换成PHP。
NightHawk

2
Ryan,这听起来很正确-要使服务器端包含正常工作,您必须以某种方式再次呼唤Apache,说:“没关系,不要将此请求作为PHP服务,而是为“此页面”服务”-或(模拟该行为),通过请求403页面来代理您自己的网站,并将输出作为原始请求的响应发送回去。
艾伦·H。

63

发送标题后,只需回显您的内容即可。

header('HTTP/1.0 403 Forbidden');

echo 'You are forbidden!';

禁止的


4
我知道我可以做到,但是如何使用已经设置的自定义错误模板?
NightHawk

3
@Ryan完全取决于应用程序的设置方式。可能只包含它。不要发送Location标头,因为它会更改响应代码。
alex


20

为此,您必须首先为浏览器说用户收到错误403。为此,您可以使用以下代码:

header("HTTP/1.1 403 Forbidden" );

然后,脚本发送“错误,错误,错误,错误,错误.......”,因此您必须停止它。您可以使用

exit;

通过这两行,服务器将发送错误并停止脚本。

别忘了:这可以模拟错误,但是您必须将其设置在.htaccess文件中,

ErrorDocument 403 /error403.php

8

看到了很多答案,但是正确的方法是按照php手册为标头函数调用提供完整选项

void header ( string $string [, bool $replace = true [, int $http_response_code ]] )

如果您使用

header('HTTP/1.0 403 Forbidden', true, 403);

将遵循使用Apache或任何其他服务器配置的HTTP 403的正常行为。


4

.htaccess

ErrorDocument 403     /403.html

1
错字,它发生了,(我有404和403.html)

即使是用户更改了标题,apache也会直接显示错误页面吗?我不知道为什么这行不通,但我只是在想...
Ibrahim AshShohail 2011年

@alex,对不起,但有时会发生

这里的人似乎认为这是不可能的,让Apache的处理请求,如果你改变了头:stackoverflow.com/questions/1501094/...
易卜拉欣AshShohail

@Ibrahim AshShohail用户如何更改标题?标头由服务器生成。

4

我已经阅读了所有答案,但都不是针对我所处情况的完整答案(在这个问题中是完全相同的),因此这是我如何收集建议答案的某些部分并提出确切解决方案的方法:

  1. 登陆服务器的真实403页面。(转到服务器上的禁止访问的URL,或转到您喜欢的任何403页)
  2. 右键单击并选择“查看源代码”。选择所有源并将其保存到域中的文件中,例如: http //domain.com/403.html
  3. 现在转到您的实际禁止页面(或php某些部分的禁止情况)示例:http : //domain.com/members/this_is_forbidden.php
  4. 任何HTML输出或标头之前回显以下代码!(即使是空格也将导致PHP发送HTML / TEXT HTTP标头,并且将不起作用)下面的代码应该是您的第一行

        <?php header('HTTP/1.0 403 Forbidden');
        $contents = file_get_contents('/home/your_account/public_html/domain.com/403.html', TRUE);
        exit($contents);
    

现在您有了确切的解决方案。我检查并验证了CPANEL最新访客,并将其注册为确切的403事件。


我可能是错的,但我会说它只是打印/home/your_account/public_html/domain.com/403.php的php。它不执行它。
Pierre-Olivier Vares

@ Pierre-OlivierVares是的,它不执行,但是已经是一个静态文件,为什么要执行它。如果仍要执行包含的文件,请使用include(“ /home/your_account/public_html/domain.com/403.php”); 代替。
塔里克

1
为什么它一定是静态文件?您自己(在编辑评论之前)写了“ .php”作为扩展名,OP在他的评论中要求提供SSI。如果它是.html文件,那么您当然可以回显它。如果它是一个.php文件,则假定它是动态的-因此,除非明确需要源代码,否则您不能仅对其进行回显。
Pierre-Olivier Vares

我无法使用.htaccess ErrorDocument,似乎这是唯一与php标头功能一起使用的解决方案。我建议将标头放在类似函数之类的函数中,例如function error403(){// @ tarik中的所有代码},然后仅在所需页面上调用error403()。
特殊的人

2

为了最大程度地减少服务器的工作量,请使其变得简单:

.htaccess

ErrorDocument 403 "Forbidden"

的PHP

header('HTTP/1.0 403 Forbidden');

die(); // or your message: die('Forbidden');

2

使用ModRewrite:

RewriteRule ^403.html$ - [F]

只需确保在www根目录中创建一个名为“ 403.html”的空白文档,否则将收到404错误而不是403错误。


嗯,还可以。我尝试过,但是REQUEST_URI变量将设置为/403.html,而不是您要限制的资源。这可能会使用户感到困惑。
杰伊·苏多

好吧,你必须玩它。ModRewrite非常强大,绝对可以解决您的问题。
杰伊·苏多

1

我了解您在apache conf或.htaccess中已经定义了ErrorDocument的情况,并且希望通过php手动发送4xx状态代码时显示这些页面。

不幸的是,这对于普通方法是不可能的,因为php直接将标头发送到用户的浏览器(而不是Apache Web服务器),而ErrorDocument是从Apache生成的http状态的显示处理程序。


-1

发送403后刷新页面:

<?php 
header('HTTP/1.0 403 Forbidden');
?>
<html><head>
<meta http-equiv="refresh" content="0;URL=http://my.error.page">
</head><body></body></html>

1
我认为这不是一个很好的解决方案。如果您要达到这个目的,为什么不发送位置标头。
Alex
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.