【问题标题】:How do I suppress the default apache error document in mod_perl?如何抑制 mod_perl 中的默认 apache 错误文档?
【发布时间】:2010-12-13 10:54:21
【问题描述】:

我正在开发一个 RESTful API,并编写了一个处理请求的 mod_perl2 处理程序。

我的处理程序通过设置 $r->status($http_code)return $http_code; 来处理错误代码

一切都很好,除了一个小问题:当我的 http_code 不是 200(例如 404)时,apache 会在我自己生成的响应中附加一个默认的 HTML 错误文档。

例如:

GET /foo

给予:

$VAR1 = bless( {
                 'status' => 404,
                 'data' => {},
                 'message' => 'Resource not found for foo'
               }, 'My::Response' );
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /foo was not found on this server.</p>
<p>Additionally, a 404 Not Found
error was encountered while trying to use an ErrorDocument to handle the request.</p>
<hr>
<address>Apache/2.0.54 (Fedora) Server at localhost Port 80</address>
</body></html>

如何摆脱这个 apache 生成的 HTML?

更新:我的错。我的 mod_perl2 处理程序返回的是 HTTP_* 代码而不是 Apache2::Const::OK。

【问题讨论】:

  • 当 Apache::Constants 不支持像 201 这样的 HTTP 状态代码时,您将如何使用 Apache 1.3 和 mod_perl 1.xx 解决这个问题?

标签: perl apache apache2 mod-perl mod-perl2


【解决方案1】:

Apache2::Response。我现在没有时间进行实验,但应该可以。

【讨论】:

  • 就是这个想法,但是我从 apache 得到了这个错误:ErrorDocument 需要两个参数,更改 HTTP 错误的响应有什么办法可以停用 apache 错误文档吗?我认为这不是问题,因为保留了返回码。例如,一些浏览器选择显示自己的错误文档而不是 apache 的。
【解决方案2】:

我也在找这个。 诀窍很简单:

$r->status(HTTP_NOT_FOUND);
$r->custom_response(404, "");
return OK;

其中 $r 是 Apache2::Response 对象。

【讨论】:

  • mod_perl 唯一的缺点是在使用custom_response 时无法设置自定义content-type。它始终设置为text/html
  • 您可以使用$r-&gt;content_type( 'application/json' ) 轻松设置您想要的内容类型。见mod_perl2 documentation
【解决方案3】:

您是在问如何在回复中不发送任何消息正文?

如果您想要的不是 apache 为您做的事情,您需要自己处理请求。你的处理程序的其余部分是什么样的?发布代码让我们无法猜测您在做什么。

您的处理程序的返回值让 apache 知道您是否自己处理了请求,或者它是否需要代表您执行更多操作。我猜你正在做后者。

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 2013-08-10
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2015-02-24
    相关资源
    最近更新 更多