这不是因为 laravel,你可以只用(windows 中的 php 5.4)重现它:
<?php
header("HTTP/1.1 401 Unauthorized");
header("Location: http://www.google.com");
看来php将其设置为302:
$ php-cgi "test.php"
Status: 302 Moved Temporarily
Location: http://www.google.com
Content-type: text/html; charset=UTF-8
在 PHP 源代码 main/SAPI.C 中:
} else if (!STRCASECMP(header_line, "Location")) {
if ((SG(sapi_headers).http_response_code < 300 ||
SG(sapi_headers).http_response_code > 307) &&
SG(sapi_headers).http_response_code != 201) {
/* Return a Found Redirect if one is not already specified */
if (http_response_code) { /* user specified redirect code */
sapi_update_response_code(http_response_code TSRMLS_CC);
} else if (SG(request_info).proto_num > 1000 &&
SG(request_info).request_method &&
strcmp(SG(request_info).request_method, "HEAD") &&
strcmp(SG(request_info).request_method, "GET")) {
sapi_update_response_code(303 TSRMLS_CC);
} else {
sapi_update_response_code(302 TSRMLS_CC);
}
}
如您所见,当您header()
使用时"Location"
,http 状态码被修改为 302
如果你反过来做,你可以让它工作:
<?php
header("Location: http://www.google.com");
header("HTTP/1.1 401 Unauthorized");
这将给出:
$ php-cgi "test.php"
Status: 401 Unauthorized
Location: http://www.google.com
Content-type: text/html; charset=UTF-8
但是laravel在设置状态后设置位置,所以状态无论如何都设置回302。但这是一个有争议的问题,即使您使用位置标头成功将状态设置为 401,浏览器也不会遵循重定向。