如何在不调用外部脚本的情况下在 apache 中返回 503 状态

dan*_*lay 30 http seo apache-2.2

我需要从我的一个站点以历史悠久的 SE_firendly 方式在维护期间返回 503 状态代码。如果不调用我宁愿避免的外部脚本,我似乎无法弄清楚如何做到这一点。

是否有一个 apache 指令可以让我返回任意的 HTTP 状态代码,而无需求助于调用设置状态标头的 php 脚本之类的黑客攻击?

小智 34

这为每个请求提供一个静态保持页面以及 503 状态。

RedirectMatch 503 ^/(?!holding\.html)
ErrorDocument 503 /holding.html
Header always set Retry-After "18000"
Run Code Online (Sandbox Code Playgroud)

RedirectMatch 用于否定保持页面本身,否则会创建无限循环。

mod_header 用于设置 Retry-After 标头,以便您可以在此示例中告诉 Google/其他机器人等您应该在 18000 秒(5 小时)后备份。您可以sudo ap2enmod header激活 mod_header (这是 Header 指令所必需的)。

  • +1:旁注:您只能添加 [RedirectMatch 503 .*] 和 [Header always set Retry-After "18000"] 规则,它适用于默认的 503 错误消息。检查 conf.d/localized-error-pages 文件,为不同的语言设置不同的消息(那些需要协商、别名和包含模块)。 (2认同)

Dav*_*ley 7

尝试

Redirect 503 / /
Run Code Online (Sandbox Code Playgroud)

来自http://httpd.apache.org/docs/2.2/mod/mod_alias.html#redirect

可以通过将数字状态代码作为状态值来返回其他状态代码。如果状态介于 300 和 399 之间,则 URL 参数必须存在,否则必须省略。请注意,Apache 代码必须知道状态(请参阅 http_protocol.c 中的函数 send_error_response)。

附加说明:这将显示 503 错误的默认/配置的 ErrorDocument。

  • `重定向 503 /` 似乎有效。 (5认同)

Phi*_*hil 7

为了让你的维护模式更加灵活,当特殊文件存在时设置503,ala:

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/.maintenance -f
RewriteRule .* - [R=503]
Run Code Online (Sandbox Code Playgroud)

注意:DOCUMENT_ROOT 的位置在 httpd 2.2 和 2.4 之间可能不同

这样,您所需要做的就是“touch /path/to/docroot/.maintenance”,您的网站将立即开始返回 503。然后为了让一切变得简单,创建一个自定义的格式良好的 html 错误页面并将其添加到正确的 apache 服务器的配置文件中:

ProxyErrorOverride on
ErrorDocument 503 /error/503.html
Run Code Online (Sandbox Code Playgroud)

如果您有多个 Web 服务器,则为了获得奖励积分,可以将 .maintenance 的位置放在共享文件系统上,或者获得更多奖励积分:

pdsh -w $web1_ip,$web2_ip,$web3_ip "sudo touch /path/to/docroot/.maintenance"

基于维护模式文件的优点是,当您的应用程序不工作时它可以工作,它快速而简单,并且前端缓存代理更容易处理,因为您可以一次性处理所有后端 503。

资料来源: