我有一个通配符证书,我们称之为 *.example.com,我已经在 Apache 中为 *.example.com 设置了一个虚拟主机(用于 HTTPS 和非 HTTPS 流量)。
一直在搞乱一些 404 响应头,但我似乎有问题,所以我做了一个简单的测试用例:
在 virtaul 主机中,我将所有流量重写为 index.php:
RewriteRule .* /index.php [QSA]
在index.php
我返回一个 404 标头:
header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");
exit();
除了那个,我什么都不做,所以没有ErrorDocument
设置或类似的。
服务器返回的标头转储(用户file_get_contents("https://test.example.com");
和print_r($http_response_header);
另一个 PHP 文件:
Array
(
[0] => HTTP/1.0 404 Not Found
[1] => Date: Mon, 08 Oct 2012 12:41:28 GMT
[2] => Server: Apache/2.2.16 (Debian)
[3] => X-Powered-By: PHP/5.3.3-7+squeeze14
[4] => Vary: Accept-Encoding
[5] => Content-Length: 57
[6] => Connection: close
[7] => Content-Type: text/html
)
如果我随后在任何子域/任何路径上输入 HTTP 站点,浏览器将正确显示默认的未找到页面,但如果我使用 HTTPS,浏览器将改为显示空白页面(IE 除外,它会正确显示(?)找到的页面)。
header("Status: 404 Not Found");
也不起作用。
这不可能吧?我在这里遗漏了什么——404 标头和通配符证书可能存在某种限制?
应 Hakre 要求更新
标头转储自headers_list()
:
Array
(
[0] => X-Powered-By: PHP/5.3.3-7+squeeze14
)
似乎服务器完全忽略了添加我的 404 标头,无论使用以下任何一种编写标头的方式:
header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");
header("HTTP/1.0 404 Not Found");
header("HTTP/1.1 404 Not Found");
其他标题如header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
正常工作。