CGI为403返回OK

时间:2014-01-02 21:16:23

标签: perl

我写了一个简单的脚本来提供自定义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为选定的响应代码添加默认(英语)状态文本?

2 个答案:

答案 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>";