我写了一个简单的脚本来提供自定义HTTP错误403页面,我使用以下代码:
use CGI qw/:standard/;
print header(
'-Status' => 403,
'-Type' => 'text/html; charset=utf-8',
'-Cache-Control' => 'private, no-cache, no-store, must-revalidate, max-age=0',
'-Pragma' => 'no-cache');
...
print $html;
我希望系统在HTTP标头中自动返回Forbidden
状态文本。
不幸的是,它会返回403 OK
而不是403 Forbidden
。文字短语更有可能被浏览器添加。
当然,我可以使用'-Status' => '403 Forbidden'
明确添加状态文字,但我仍然想知道为什么不自动完成,以及为什么我会获得OK
状态... < / p>
有没有办法强制Perl
为选定的响应代码添加默认(英语)状态文本?
答案 0 :(得分:1)
Chrome是这里的罪魁祸首。您可以通过在命令行上运行代码段进行验证,该代码行输出以下标题:
Status: 403
Pragma: no-cache
Cache-control: private, no-cache, no-store, must-revalidate, max-age=0
Content-Type: text/html; charset=utf-8
请注意,状态为普通403
。
CGI.pm不了解reason phrases recommended by the HTTP spec。它也不应该:它们只是建议(而不是默认值),您可以将它们更改为您想要的任何内容,而不会影响协议(403 Go away
任何人?)。根据该标准,客户不需要查看原因短语。
所以不,除非您修改CGI.pm,否则无法强制Perl添加原因短语。即使您确实提供了一个原因短语,浏览器也可以按照自己的意愿行事(尽管大多数浏览器都可能表现得很好)。
答案 1 :(得分:-1)
我一直在寻找这个很长的时间,基本上它非常简单:
见 https://serverfault.com/questions/121735/how-to-return-404-from-apache2-cgi-program
排序: 改变
use CGI qw/:standard/;
print header(
'-Status' => 403,
'-Type' => 'text/html; charset=utf-8',
...
到
print "Status: 403 Forbidden\r\n";
print "Content-Type: text/html\r\n\r\n";
print "<h1>403 Forbidden!</h1>";