在 Apache 中强制使用 SSL,无需对主机名进行硬编码

在 Apache 中强制使用 SSL,无需对主机名进行硬编码

思考我已经把这个问题整理好了(主要感谢这个问题如何在不使用 .htaccess 进行硬编码的情况下将非 www 重定向到 www?),但我仍然不完全理解一些事情。

我想强制将到我服务器的所有非 SSL 连接路由到 SSL。我只有一个虚拟主机(并且在整个服务器生命周期内都将始终如此),但我想避免对域名进行硬编码,部分原因是为了让httpd.confStaging 和 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]

不过,我有两个相对简单的问题:

  1. 出于任何原因,我是否应该选择其中一个RewriteCond语句而不是另一个语句?假设我使用该%{SERVER_PORT}变量,那么端口 8000 上的任何连接都将继续以明文形式提供服务?我是否应该避免使用%{HTTPS}我忽略的变量?
  2. %{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 如此友好地提供的那样)。

它甚至可能更快,因为需要加载/运行的模块少了一个。

相关内容