在生产环境中强制使用HTTPS的.htaccess配置

7

我一直在寻找一个能够强制使用 https:// 的代码片段。我发现了以下内容:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

问题在于当我想在本地工作时,使用类似“localhost”或“example.dev”的url时,它试图重定向到https://localhost(但它不能工作)。
我该怎么解决这个问题?
(总而言之,我希望上面的片段仅在我在生产中使用它时起作用,例如“example.com”)
3个回答

15

我希望上面的代码片段只在生产环境下使用(例如example.com)。

您可以使用重写条件将规则限制为仅针对example.com

RewriteEngine On

RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301]

这个能够在有或没有 www 的情况下工作吗?因此,任何一种方式都会强制使用 SSL 吗? - Jordan

2
对于Apache,将您的规则放置在<IfModule mod_ssl.c></IfModule>块内,并在本地服务器上禁用ssl模块。
<IfModule mod_ssl.c>
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

1

这有点高级,但你可以尝试将服务器放在一个名为servers.txt的文件中。

RewriteEngine on
RewriteMap lb rnd:servers.txt
RewriteRule ^/(.*) http://${lb:servers}/$1 [P,L]
serverlist.txt will contain a list of the servers:

## serverlist.txt file con
servers localhost.example.com|server1.example.com

上述答案已经足够解释了本地和生产环境下的mod rewrite行为差异。在这种情况下,我会将.htaccess文件版本化到git或subversion中(无论您使用哪个版本控制工具)。
这主要是用于负载均衡,但您也可以将其应用于您的机制中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接