我需要在我的某个网站停机维护期间以传统的 SE_firendly 方式返回 503 状态代码。我似乎无法弄清楚如何在不调用外部脚本的情况下执行此操作,而我宁愿避免调用外部脚本。
是否存在一个 apache 指令,可以让我返回任意的 HTTP 状态代码,而无需诉诸诸如调用设置状态标头的 php 脚本之类的黑客手段?
答案1
这为每个请求提供一个静态保持页面以及 503 状态。
RedirectMatch 503 ^/(?!holding\.html)
ErrorDocument 503 /holding.html
Header always set Retry-After "18000"
RedirectMatch 用于否定持有页面本身,否则会造成无限循环。
mod_header 用于设置 Retry-After 标头,以便您可以告诉 Google/其他机器人等,您应该在本例中 18000 秒(5 小时)后备份。您可以sudo ap2enmod header
激活 mod_header(这是 Header 指令所必需的)。
答案2
尝试
Redirect 503 /
从https://httpd.apache.org/docs/2.4/mod/mod_alias.html#redirect:
可以通过将数字状态代码作为 status 的值来返回其他状态代码。如果状态介于 300 和 399 之间,则必须提供 URL 参数。如果状态不在 300 和 399 之间,则必须省略 URL 参数。
附加说明:这将显示 503 错误的默认/配置的 ErrorDocument。
答案3
为了使您的维护模式更加灵活,当存在特殊文件时设置 503,ala:
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/.maintenance -f
RewriteRule .* - [R=503]
注意:httpd 2.2 和 2.4 中的 DOCUMENT_ROOT 位置可能有所不同
这样,您只需“触摸 /path/to/docroot/.maintenance”,您的站点就会立即开始返回 503。然后,为了让一切顺利,创建一个自定义的格式良好的 html 错误页面,并将其添加到正确的 apache 服务器的配置文件中:
ProxyErrorOverride on
ErrorDocument 503 /error/503.html
如果您有多个 Web 服务器,可以将 .maintenance 放在共享文件系统上,这样可以得到加分,或者可以得到更多的加分:
pdsh -w $web1_ip,$web2_ip,$web3_ip "sudo touch /path/to/docroot/.maintenance"
使维护模式基于文件的优点是,当您的应用程序不起作用时它可以工作,它快速而简单,并且前端缓存代理更容易处理,因为您可以一次性处理所有后端 503。
资料来源: