我发现几乎每个示例都不完整,所以我将我的解决方案带到了桌面上。我需要根据我的服务器环境(本地或生产环境)创建一个变量,然后根据该服务器环境运行重写。具体来说,如果环境是生产环境,我想强制 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>
笔记:
- 第一个变量名为“SERVER_ENV”,值为“production”。这个变量名/值可以是任何东西。例如,您可以使用 MY_ENVIRONMENT:live。在 .htaccess 中创建此变量后,您应该能够在 phpinfo 文件中找到它的引用——这是检查它是否存在的好方法。
RewriteCond 行应该在 RewriteRule 之前,并且应该组合在一起,如图所示。在重写规则生效之前,您可以有 1 个或多个必须满足的重写条件。
如果 HTTP_HOST 是“本地”,我将设置一个不同的变量。我没有任何使用“本地”变量的重写条件/规则——我只是为了说明而在此处设置它。