12

我试图在我的 .htaccess 文件中定义一个环境变量,然后使用该变量运行重写条件。以下是我的 .htaccess 文件中的内容,但重写不起作用:

RewriteEngine on
#set to 'live' or 'maintenance'
SetEnv ENVIRONMENT maintenance

#If the ENVIRONMENT variable is 'mainetnance' then show a maintenance page to the users
RewriteCond %{ENV:ENVIRONMENT} maintenance
RewriteRule ^(.*)$ /maintenance.html

这样做的目的是通过让 PHP 在收到来自 GitHub 钩子之一的发布请求以拉取 repo 进行更新时,以编程方式将站点设置为维护模式。

4

3 回答 3

19

mod_rewrite 不使用通过 SetEnv 设置的变量,而是使用此方法:

#set to 'live' or 'maintenance'
RewriteRule .* - [E=STATUS:maintenance]

#If the ENVIRONMENT variable is 'maintenance' then show a maintenance page
RewriteCond %{REQUEST_URI} !maintenance.html [NC]
RewriteCond %{ENV:STATUS} ^maintenance$
RewriteRule ^.*$ /maintenance.html [L]

底部三行的第一行,确保一旦用户被重定向到文件“maintenance.html”,就不会再次被重定向。否则,用户不断被重定向到同一个文件,导致 500 内部服务器错误说“AH00124:由于可能的配置错误,请求超出了 10 个内部重定向的限制”。

于 2013-08-04T20:59:46.190 回答
9

我发现几乎每个示例都不完整,所以我将我的解决方案带到了桌面上。我需要根据我的服务器环境(本地生产环境)创建一个变量,然后根据该服务器环境运行重写。具体来说,如果环境是生产环境,我想强制 https 和 www。

为什么不为每个服务器环境创建一个唯一的 .htaccess 文件?因为,我想在我的 Git 存储库中包含 .htaccess,而不用担心搞砸我的一个环境。

您需要知道的第一件事是所有这些都必须发生在 mod_rewrite 中,这意味着您必须在 Apache 实例中启用 mod_rewrite。如果您不知道如何检查,请创建一个 phpinfo 页面(http://www.phpinfofile.com/)并在“加载的模块”部分中搜索“mod_rewrite”。

.htaccess 代码:

<IfModule mod_rewrite.c>

# Set SERVER_ENV=production if HTTP_HOST matches my production URL
RewriteCond %{HTTP_HOST} ^(www\.)?mysite\.com$ [NC]
RewriteRule .* - [E=SERVER_ENV:production]

# Force www. if SERVER_ENV is production
RewriteCond %{ENV:SERVER_ENV} ^production$
RewriteCond %{HTTP_HOST} !^www [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# Force https if SERVER_ENV is production
RewriteCond %{ENV:SERVER_ENV} ^production$
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# Set SERVER_ENV=local if HTTP_HOST matches my local URL
RewriteCond %{HTTP_HOST} ^www-local\.mysite\.local$ [NC]
RewriteRule .* - [E=SERVER_ENV:local]

</IfModule>

笔记:

  1. 第一个变量名为“SERVER_ENV”,值为“production”。这个变量名/值可以是任何东西。例如,您可以使用 MY_ENVIRONMENT:live。在 .htaccess 中创建此变量后,您应该能够在 phpinfo 文件中找到它的引用——这是检查它是否存在的好方法。

在此处输入图像描述

  1. RewriteCond 行应该在 RewriteRule 之前,并且应该组合在一起,如图所示。在重写规则生效之前,您可以有 1 个或多个必须满足的重写条件。

  2. 如果 HTTP_HOST 是“本地”,我将设置一个不同的变量。我没有任何使用“本地”变量的重写条件/规则——我只是为了说明而在此处设置它。

于 2016-02-12T22:02:09.493 回答
5

有点晚了-但是对于所有其他搜索...

使用SetEnvIf - 请参阅: mod_rewrite 规则和 setenv

SetEnvIf Request_URI ".*" ENVIRONMENT=maintenance

...

于 2015-12-15T13:30:06.943 回答