我思考我已经把这个问题整理好了(主要感谢这个问题如何在不使用 .htaccess 进行硬编码的情况下将非 www 重定向到 www?),但我仍然不完全理解一些事情。
我想强制将到我服务器的所有非 SSL 连接路由到 SSL。我只有一个虚拟主机(并且在整个服务器生命周期内都将始终如此),但我想避免对域名进行硬编码,部分原因是为了让httpd.conf
Staging 和 Production 的文件保持相同。
mod_rewrite
我知道我可以通过类似以下规则强制请求使用 SSL
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
或者
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
不过,我有两个相对简单的问题:
- 出于任何原因,我是否应该选择其中一个
RewriteCond
语句而不是另一个语句?假设我使用该%{SERVER_PORT}
变量,那么端口 8000 上的任何连接都将继续以明文形式提供服务?我是否应该避免使用%{HTTPS}
我忽略的变量? %{HTTP_HOST}
语句中的变量是否RewriteRule
会被尊重并自动替换Host:
请求中的标头?在某些情况下这可能无法工作吗?
为了以防万一,我们在 RedHat 上运行 Apache 2,mod_ssl
并且网站使用 Drupal 7。
抱歉,这个问题比较愚蠢;Apache 系统管理员绝不是我工作的核心部分,所以我正在尽力应付。谢谢大家!
答案1
我一直使用类似下面的方法:
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
因为偶尔,我喜欢通过 80 以外的端口提供 HTTP 服务。好吧,我不喜欢这样做,但有时需要等
%{HTTPS}
才会成立,例如,如果在端口 80 上使用 SSL。
我想我通常使用
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
%{HTTP_HOST}
Host:
始终是客户端 设置的标题。
然而,我突然想到,还有其他方法可以做到这一点。
<VirtualHost *:80>
ServerName mysite.example.com
Redirect permanent / https://mysite.example.com/
</VirtualHost>
你会注意到上面的代码块中没有 DocumentRoot。如果你正在重定向一切,你不需要。
如果你只想将网站的一部分重定向到 SSL,那么你可以这样做
Redirect permanent /secure https://mysite.example.com/secure
我认为重定向选项对于全站 HTTPS 强制来说更可取,因为它减少了一个级别的疯狂(正如 mod_rewrite 如此友好地提供的那样)。
它甚至可能更快,因为需要加载/运行的模块少了一个。