我想在 .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>
表达式很早就被评估,但合并晚的。)