自定义错误响应

尽管在出现 4xx 或 5xx HTTP 状态代码的情况下,Apache HTTP Server 提供了通用的错误响应,但这些响应相当明显,毫无意义,并且可能使站点用户感到恐惧。您可能希望提供更友好的自定义错误响应,或者以英语以外的其他语言提供自定义错误响应,或者提供的样式可能更符合您的网站布局。

可以为指定为错误条件的任何 HTTP 状态代码(即任何 4xx 或 5xx 状态)定义定制的错误响应。

此外,提供了一组值,以便可以使用服务器端包括根据这些变量的值进一步自定义错误文档。或者,您可以通过 cgi 程序或使用这些变量的其他动态处理程序(PHP,mod_perl 等)来处理错误情况。

Configuration

使用ErrorDocument指令配置自定义错误文档,该指令可在全局,虚拟主机或目录上下文中使用。如果AllowOverride设置为 FileInfo,则可以在.htaccess 文件中使用它。

ErrorDocument 500 "Sorry, our script crashed. Oh dear"
ErrorDocument 500 /cgi-bin/crash-recover
ErrorDocument 500 http://error.example.com/server_error.html
ErrorDocument 404 /errors/not_found.html
ErrorDocument 401 /subscription/how_to_subscribe.html

ErrorDocument指令的语法为:

ErrorDocument <3-digit-code> <action>

该动作将被视为:

  • 重定向到的本地 URL(如果操作以“ /”开头)。

  • 重定向到的外部 URL(如果操作是有效的 URL)。

  • 要显示的文本(如果以上都不显示)。如果文本包含多个单词,则必须用引号(“)引起来。

重定向到本地 URL 时,将设置其他环境变量,以便可以进一步自定义响应。它们不会发送到外部 URL。

Available Variables

重定向到另一个 URL 可能很有用,但前提是可以传递一些信息,然后可以使用这些信息更清楚地解释或记录错误情况。

为此,在发送错误重定向时,将设置其他环境变量,该环境变量将通过在原始报头名称前加上“ REDIRECT_”,从提供给原始请求的报头中生成。这为错误文档提供了原始请求的上下文。

例如,除更常见的环境变量外,您可能还会收到以下内容。

REDIRECT_HTTP_ACCEPT=*/*, image/gif, image/jpeg, image/png REDIRECT_HTTP_USER_AGENT=Mozilla/5.0 Fedora/3.5.8-1.fc12 Firefox/3.5.8 REDIRECT_PATH=.:/bin:/usr/local/bin:/sbin REDIRECT_QUERY_STRING= REDIRECT_REMOTE_ADDR=121.345.78.123 REDIRECT_REMOTE_HOST=client.example.com REDIRECT_SERVER_NAME=www.example.edu REDIRECT_SERVER_PORT=80 REDIRECT_SERVER_SOFTWARE=Apache/2.2.15 REDIRECT_URL=/cgi-bin/buggy.pl

REDIRECT_环境变量是根据重定向之前存在的环境变量创建的。它们使用REDIRECT_前缀重命名,即*,HTTP_USER_AGENT变为REDIRECT_HTTP_USER_AGENT

保证设置REDIRECT_URLREDIRECT_STATUSREDIRECT_QUERY_STRING,并且仅在错误条件之前存在其他 Headers 时才设置它们。

如果ErrorDocument目标是外部重定向(以http:开头的方案名称,即使该名称与服务器指向同一主机),则将 不设置任何

自定义错误响应

如果将ErrorDocument指向各种动态处理程序,例如服务器端包含文档,CGI 脚本或其他各种处理程序,则可能希望使用可用的自定义环境变量来自定义此响应。

如果 ErrorDocument 指定了对 CGI 脚本的本地重定向,则该脚本应在其输出中包含“ Status:”头字段,以确保将导致被调用的错误条件一直传播到 Client 端。例如,Perl ErrorDocument 脚本可能包括以下内容:

...
print  "Content-type: text/html\n";
printf "Status: %s Condition Intercepted\n", $ENV{"REDIRECT_STATUS"};
...

如果该脚本专用于处理特定的错误情况,例如404 Not Found,则可以改用特定的代码和错误文本。

请注意,如果响应包含Location:Headers(以便发出 Client 端重定向),则脚本必须发出适当的Status:Headers(例如302 Found)。否则,Location:Headers 可能无效。

多国语言自定义错误文档

Apache HTTP Server 的安装随附提供了一个自定义错误文档的目录,该目录已翻译成 16 种不同的语言。 conf/extra配置目录中还有一个配置文件,可以包含该文件以启用此功能。

在服务器配置文件中,您将看到如下一行:

# Multi-language error messages
#Include conf/extra/httpd-multilang-errordoc.conf

取消 Comments 此Include行将启用此功能,并根据 Client 端浏览器中设置的语言首选项提供经过语言协商的错误消息。

此外,这些文档包含各种REDIRECT_变量,以便可以向最终用户提供有关发生了什么以及它们现在可以做什么的其他信息。

您可以随意定制这些文档,以向用户提供有关您站点以及站点期望内容的更多有用信息。

必须启用mod_includemod_negotiation才能使用此功能。