我在
.htaccess
文件中有以下规则,用于将我的 Wordpress 博客重定向到维护页面。
#Redirecting to maintenance page
RewriteCond %{REQUEST_URI} !^blogs/maintenance\.html$
RewriteRule ^(.*)$ https://www.my-domain.com/blogs/maintenance.html [R=307, L]
这工作正常,所有页面都重定向到维护页面。现在我需要在条件中添加
wp-admin
,这样我就可以登录到管理员端。我尝试了以下方法:
RewriteCond %{REQUEST_URI} !^blogs/maintenance\.html$
RewriteCond %{REQUEST_URI} !^blogs/wp-admin/$
RewriteRule ^(.*)$ https://www.my-domain/blogs/maintenance.html [R=307, L]
但这不起作用,
wp-admin
被重定向到维护页面。
检查这个-
RewriteCond %{REQUEST_URI} !^blogs/maintenance\.html$ [OR]
RewriteCond %{REQUEST_URI} ^blogs/wp-admin/
RewriteRule ^(.*)$ https://www.my-domain.com/blogs/maintenance.html [R=307,L]
RewriteCond %{REQUEST_URI} !^blogs/maintenance\.html$ RewriteCond %{REQUEST_URI} !^blogs/wp-admin/$ RewriteRule ^(.*)$ https://www.example.com/blogs/maintenance.html [R=307, L]
这里(以及您原来的规则)有几个错误:
REQUEST_URI
服务器变量的值以斜杠开头,因此第一个(和第二个)condition 总是会成功。 (但这会导致重定向循环 - 除非您将规则放在 .htaccess
文件末尾的错误位置??)!^blogs/wp-admin/$
)中包含了一个字符串结尾锚点,因此它只会匹配那个确切的URL。您需要防止维护页面显示为 以 /blogs/wp-admin/
.[R=307, L]
。这在语法上是无效的,并且会因 500 错误而中断(我认为它不是,但如何?)所以,它应该是这样的:
RewriteCond %{REQUEST_URI} !^/blogs/wp-admin(/|$)
RewriteRule !^blogs/maintenance\.html$ https://www.example.com/blogs/maintenance.html [R=307,L]
这应该放在
.htaccess
文件的顶部。
您还需要排除您的管理页面或维护页面正在使用的任何其他资产(和 AJAX 请求)。
我已经将第一个条件移动到
RewriteRule
pattern。请注意,RewriteRule
pattern 匹配的 URL 路径确实 not 以斜杠开头。
旁白:
但是,您不应该重定向请求以提供“维护中”页面。直接提供“503 服务不可用”响应,理想情况下提供
Retry-After
HTTP 响应标头,以通知搜索引擎何时恢复抓取。例如:
ErrorDocument 503 /blogs/maintenance.html
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !^/blogs/wp-admin(/|$)
RewriteRule ^ - [R=503]
Header always set Retry-After "Mon, 15 Mar 2023 19:00:00 GMT"
这将 503 响应用作内部子请求,没有外部重定向(第二个请求)。
maintenance.html
文档不会暴露给最终用户,因为 URL 不会更改。通过检查 REDIRECT_STATUS
环境变量,我们还可以将 503 响应发送到 maintenance.html
文档本身的直接请求。