使用基于名称的虚拟主机强制使用 SSL(可能使用 .htaccess)

使用基于名称的虚拟主机强制使用 SSL(可能使用 .htaccess)

我有几个子域,它们由 Apache 使用基于名称的虚拟主机提供服务。设置方式是,我有一个目录,其中包含网站的所有页面,但可以使用多个子域(每个客户使用不同主题的 Web 应用程序)访问它。对于每个子域,我都有一个指向主目录的符号链接,它与基于名称的虚拟主机映射相匹配。因此,我只需在 php 脚本中使用 $_SERVER['HTTP_HOST'] 来确定要服务哪个主题,但代码库是相同的。问题是网站需要 SSL,而我很难弄清楚如何强制这样做。

我曾见过 .htaccess 的这个例子:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

但麻烦的是,它要求您对域名 www.example.com 进行硬编码。我怎样才能让它转到实际请求的域名的 SSL 版本,而不是对其进行硬编码?

我已经看到{HTTP_HOST}变量在 .htaccess 的一部分中使用RewriteCond,但当我尝试在 中使用它时它似乎不起作用RewriteRule。尝试了以下操作,结果出现了 500 错误:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://{HTTP_HOST}/$1 [R,L]

答案1

在替换字符串中使用相同条件变量的能力使这个问题变得简单。

改变

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L]

答案2

Apache SSL 不适用于名称虚拟主机。请参阅:

http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI

相关内容