重写规则在 Apache 2.4 上的 .htaccess 中的<If>块内不起作用

问题描述 投票:0回答:1

我迷路了。我的重写规则确实工作正常,直到我将其放入

<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 条件是否有效。

if-statement mod-rewrite apache2.4
1个回答
0
投票

这很可能是由于处理顺序造成的。

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 来提供自定义维护页面。

© www.soinside.com 2019 - 2024. All rights reserved.