使用标头重定向,但http代码始终为200

时间:2018-11-22 17:17:08

标签: php http

因此,我有一个页面可以检查用户是否已登录,如果不是,则将其重定向到错误代码为403的错误页面。这是我用来重定向的代码:

"plugin:node/recommended"

但是,除了重定向之外,它只会将代码设置为403。如果我尝试这样做:

header('Location: /error.php', true, 403);

然后它重定向,但是代码是200 ... 我真的在这里迷路了,找不到任何有效的方法。

ps:这是我的error.php页面

header('HTTP/1.1 403 FORBIDDEN');
header('Location: /error.php');

4 个答案:

答案 0 :(得分:3)

从文档中

  

从文档中:“第二个特殊情况是“ Location:”标头。它不仅将此标头发送回浏览器,而且还向浏览器返回REDIRECT(302)状态代码,除非201或已经设置了3xx状态代码。

http://php.net/manual/en/function.header.php

话虽如此,您可以在error.php页面中添加标题

header("HTTP/1.0 403 Forbidden");

答案 1 :(得分:2)

不使用重定向,而是脚本重用。

重定向意味着“您正在寻找的东西,可以在其他地方找到”。您不想将用户发送到其他地方。您想告诉他们不允许他们去尝试去的地方。

相反,使用require来包含php脚本,该脚本应向用户显示有关错误的信息,而无需更改URI。

if(detectedUserNotAllowed)
{
   header('HTTP/1.1 403 FORBIDDEN');
   require("error.php");
   exit();
}

答案 2 :(得分:1)

您无需重定向-您只需生成403(或其他适当的错误代码),然后让Apache发送正确的ErrorDocument

https://httpd.apache.org/docs/2.4/mod/core.html#errordocument

EG-

ErrorDocument 403 /errors/forbidden.php?referrer=%{escape:%{HTTP_REFERER}}

在您的Apache vhost配置或.htaccess文件中。

即使Apache的文档也记录了有关发送状态代码后再发送重定向的注释之一-

  

请注意,当您指定指向远程目录的ErrorDocument时   URL(即前面带有诸如http之类的方法的任何内容),Apache   HTTP Server会将重定向发送到客户端,以告诉客户端该在哪里   查找文档,即使文档最终位于同一文档中   服务器。这有几个含义,最重要的是   客户端不会收到原始错误状态代码,但是   而是会收到重定向状态代码。这反过来会造成混乱   网络机器人和其他尝试确定URL是否有效的客户端   使用状态码。此外,如果您在   ErrorDocument 401,客户端将不知道提示用户输入   密码,因为它将不会收到401状态代码。因此,如果   您使用ErrorDocument 401指令,则它必须引用本地   文档。

答案 3 :(得分:0)

您无法使用3xx代码进行重定向,如果状态代码不是{{1}}部分之一,浏览器将不会关注位置标头。

可以在RFC 7231中找到它:

  

对于3xx(重定向)响应,位置值是指   自动重定向的首选目标资源   请求。