Как подавить документ об ошибке apache по умолчанию в mod_perl?

Я разрабатываю 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.


person jeje    schedule 05.11.2009    source источник
comment
Как бы вы решили эту проблему с Apache 1.3 и mod_perl 1.xx, когда Apache::Constants не поддерживает такие коды состояния HTTP, как 201?   -  person Gaurav Dadhania    schedule 01.06.2011


Ответы (3)


См. Apache2::Response. У меня сейчас нет времени экспериментировать, но это должно сработать.

person Sinan Ünür    schedule 05.11.2009
comment
Это идея, но у меня есть эта ошибка от apache: ErrorDocument принимает два аргумента, Изменить ответы на ошибки HTTP. Есть ли способ деактивировать документы об ошибках apache? Я не думаю, что это проблема, так как код возврата сохраняется. Например, некоторые браузеры предпочитают отображать свои собственные документы об ошибках вместо документов Apache. - person jeje; 05.11.2009

Я тоже искал это. И трюк был довольно прост:

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

где $r — объект Apache2::Response.

person Kakash1hatake    schedule 26.11.2015
comment
Единственное, что здесь отстойно с mod_perl, это невозможность установить пользовательский content-type при использовании custom_response. Он всегда устанавливается как text/html. - person Francisco Zarabozo; 08.11.2018
comment
Вы можете легко установить нужный тип контента, например, с помощью $r->content_type( 'application/json' ). См. документацию по mod_perl2. - person Jacques; 16.12.2020

Вы спрашиваете, как не отправлять тело сообщения в своем ответе?

Если вы хотите что-то другое, чем то, что apache собирается сделать для вас, вам нужно обработать запрос самостоятельно. Как выглядит остальная часть вашего обработчика? Код публикации не дает нам догадаться, что вы делаете.

Возвращаемое значение от вашего обработчика позволяет apache узнать, обработали ли вы запрос самостоятельно или ему нужно сделать что-то еще от вашего имени. Я предполагаю, что вы делаете последнее.

person brian d foy    schedule 05.11.2009