在Apache中强制使用SSL而不对主机名进行硬编码

认为我有这种sorting(主要是感谢如何将非wwwredirect到www而不使用.htaccess硬编码? ),但我仍然不完全了解一些事情。

我想强制所有非SSL连接到我的服务器路由到SSL。 我只有一个虚拟主机(在服务器的生命周期中,这种虚拟主机仍然是可靠的),但我想避免对域名进行硬编码,部分是为了使分段和生产的httpd.conf文件保持一致。

我知道我可以强制使用SSL的mod_rewrite规则的请求

 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}variables,端口8000上的任何连接都将继续在清除中服务。 是否有一些原因我应该避免使用我忽略的%{HTTPS}variables?
  2. RewriteRule语句中的%{HTTP_HOST}variables是否会受到尊重,并在请求的Host:标头中自动replace? 有什么情况下可能无法工作?

如果它有所作为,我们使用mod_ssl在RedHat上运行Apache 2,而站点使用Drupal 7。

对不起,什么是一个相对愚蠢的问题; Apache系统pipe理员绝不是我工作的核心部分,所以我尽可能地努力。 谢谢,所有!

我一直使用类似以下的东西:

 RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] 

因为偶尔我喜欢在80以外的端口上提供HTTP。呃,我不喜欢这样做,但有时候需要这样做。 %{HTTPS}将是真实的,例如,如果通过端口使用SSL 80。

我想我通常使用

 RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

%{HTTP_HOST}将始终是由客户端设置为Host:标头的内容。

这发生在我身上,然而..还有另一种方式来做到这一点。

 <VirtualHost *:80> ServerName mysite.example.com Redirect permanent / https://mysite.example.com/ </VirtualHost> 

您会注意到上面的块中没有DocumentRoot。 如果你把所有东西都重新定向,你就不需要一个。

如果您只想将您的网站的一部分redirect到SSL,则可以这样做

 Redirect permanent /secure https://mysite.example.com/secure 

我认为redirect选项对于全站点HTTPS强制更为可取,因为它是一个较less的精神错乱(正如mod_rewrite所提供的那样)。

它甚至可能会更快,因为将会有一个模块加载/运行。