Apache .htaccess if 不适用于本地分配的环境变量

Apache .htaccess if 不适用于本地分配的环境变量

我想在 .htaccess 文件中设置环境变量。每当网站设置为维护模式时,第一行就会被脚本更改。

# maintenance mode on/off
SetEnvIf maintenance 0

<If "env('maintenance') == '1'">
    ErrorDocument 503 /maintenance.html
    <IfModule mod_rewrite.c>
       RewriteEngine On
       RewriteCond %{REQUEST_URI} !=/maintenance.html
       RewriteCond %{REQUEST_METHOD} ^(GET|HEAD|POST|PROPFIND|PUT) [NC]
       RewriteCond %{REMOTE_ADDR} !=#####our public ip address from service net###
       RewriteRule ^.*$ - [R=503,L]


</If>
<Else>
       # normal mode
       DirectoryIndex app.php

       # to the front controller "/app.php" but be rewritten to "/app.php/app".
       <IfModule mod_negotiation.c>
           Options -MultiViews
       </IfModule>

       <IfModule mod_rewrite.c>
           RewriteEngine On
           RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
           RewriteRule ^(.*) - [E=BASE:%1]
           RewriteCond %{ENV:REDIRECT_STATUS} ^$
           RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]
           RewriteCond %{REQUEST_FILENAME} -f
           RewriteRule .? - [L]
           RewriteRule .? %{ENV:BASE}/app.php [L]
       </IfModule>

       <IfModule !mod_rewrite.c>
           <IfModule mod_alias.c>
               RedirectMatch 302 ^/$ /app.php/
           </IfModule>
       </IfModule>
</Else>

我无法通过将第一行设置为“1”来激活维护模式

答案1

SetEnvIf maintenance 0

你的语法错误...你试图将SetEnv(mod_env) 语法与更复杂的SetEnvIf(mod_setenvif) 指令一起使用。因此,要么使用SetEnv

SetEnv maintenance 1

或者,使用SetEnvIf

SetEnvIf ^ ^ maintenance=1

第一个^是“匹配”任何 HTTP 请求标头的正则表达式,第二个^是“匹配”该标头的正则表达式。换句话说,这始终是成功的,并且环境变量始终被设置。

但是,你可以需要在这里使用SetEnvIf,因为SetEnv处理得更晚(有时太晚了)。(<If>表达式很早就被评估,但合并晚的。)

相关内容