我有几个子域,它们由 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 不适用于名称虚拟主机。请参阅: