因此,我有一个页面可以检查用户是否已登录,如果不是,则将其重定向到错误代码为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');
答案 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(重定向)响应,位置值是指 自动重定向的首选目标资源 请求。