我迷路了。我的重写规则确实工作正常,直到我将其放入
<If>
块中。
当我通过谷歌和 ChatGPT 在这里搜索答案时,我确实对这是否可能完全有一个混合的想法。
有人建议我可能需要更改什么才能使其在我的网络托管商的 Apache 2.4 服务器上运行吗?
SetEnv MAINTENANCE_MODE 1
RewriteEngine On
# REWRITE REQUESTS TO /MAINTENANCE(/) TO /MAINTENANCE.HTML
RewriteRule ^maintenance/?$ /maintenance.html [L,END]
<If "%{ENV:MAINTENANCE_MODE} == '1'">
# EXCLUDE IPS FROM THIS REWRITE
RewriteCond %{REMOTE_ADDR} !=1.2.3.41
RewriteCond %{REMOTE_ADDR} !=1.2.3.42
# EXCLUDE MAINTENANCE.HTML AND THE MAINTENANCE URL ITSELF FROM BEING REDIRECTED
RewriteCond %{REQUEST_URI} !^/maintenance\.html$
RewriteCond %{REQUEST_URI} !^/maintenance/?$
# REDIRECT ALL OTHER IPS TO THE MAINTENANCE PAGE
RewriteRule ^(.*)$ /maintenance/ [R=302,L]
</If>
顺便说一句 - 我已经用
AddType application/x-lsphp83 .php
块内的 <If>
检查了 If 条件是否有效。
这很可能是由于处理顺序造成的。
SetEnv
处理得很晚。 <If>
表达式会较早求值,但会较晚合并。 mod_rewrite 很早就被处理,并且当包含在 <If>
块中时,其行为“不同”。
尝试以下方法...
SetEnvIf
设置环境变量,该环境变量会提前处理。<If>
表达式,因为可以在 mod_rewrite 条件中评估环境变量。例如:
SetEnvIf ^ ^ MAINTENANCE_MODE=1
RewriteEngine On
# REWRITE REQUESTS TO /MAINTENANCE(/) TO /MAINTENANCE.HTML
RewriteRule ^maintenance/?$ /maintenance.html [END]
# Only when MAINTENANCE_MODE is set
RewriteCond %{ENV:MAINTENANCE_MODE} =1
# EXCLUDE IPS FROM THIS REWRITE
RewriteCond %{REMOTE_ADDR} !=1.2.3.41
RewriteCond %{REMOTE_ADDR} !=1.2.3.42
# EXCLUDE MAINTENANCE.HTML AND THE MAINTENANCE URL ITSELF FROM BEING REDIRECTED
RewriteCond %{REQUEST_URI} !^/maintenance(\.html|/)?$
# REDIRECT ALL OTHER IPS TO THE MAINTENANCE PAGE
RewriteRule ^ /maintenance/ [R=302,L]
尽管如此,请考虑发送 503 来提供自定义维护页面。