我一直在寻找解决方案,以便能够使用虚拟主机强制在所有 URL 前面使用 https ://www。这是我目前在 000-default.conf 文件中的内容:
<VirtualHost *:80>
ServerName www.domain.com
Redirect / https://www.domain.com/
</VirtualHost >
这意味着所有 www. 都会重定向到 https ://www.
现在我缺少将所有/任何其他形式的 URL 重定向到的代码https://www. 使用相同的概念(不是 RewriteEngine,因为 Apache 建议不要在简单重定向上使用 RewriteEngine)。
例如:
- http://域名.com
- http://www.domain.com
- https://域名.com
他们都会去 =>https://www.domain.com
如果有人能给我指明正确的方向,那就太好了!
答案1
这对我有用,如果你愿意的话,你可以在我的域上测试它。
<VirtualHost *:80>
ServerName freesoftwareservers.com
ServerAlias *.freesoftwareservers.com
Redirect / https://www.freesoftwareservers.com/
</VirtualHost>
<VirtualHost *:443>
ServerName freesoftwareservers.com
ServerAlias *.freesoftwareservers.com
我在重新实现这个功能时遇到了问题,我发现如果我从 /sites-enabled 中删除 000-default.conf 符号链接,它就可以正常工作。不确定是怎么回事,但我在 DNS 端没有其他 DNS 记录,我的 Apache 执行了所有重定向,它就可以正常工作。
答案2
您需要三次重定向才能完成您想要的操作:
http://example.com
到https://www.example.com
http://www.example.com
到https://www.example.com
https://example.com
到https://www.example.com
前两个来自端口 80 纯 HTTP,因此您有一个 VirtualHost。您可以通过 ServerAlias 部分将 VirtualHost 部分应用于多个主机名(www.example.com 和 example.com):
# Redirect http://example.com and http://www.example.com to main site
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
Redirect / https://www.example.com/
</VirtualHost >
然后你需要一个 VirtualHost 来https://example.com仅限。HTTPS 使用端口 443:
# Redirect https://example.com to main site
<VirtualHost *:443>
ServerName example.com
Redirect / https://www.example.com/
</VirtualHost >
注意:您还需要在那里设置 SSL 设置,并使用支持带和不带“www.”的域名的证书。设置 SSL 设置不在本问题的讨论范围内。(补充信息:如果您愿意,可以是两个单独的证书;现在我们有 Let's Encrypt 和 SNI 之类的东西,拥有大量单独的证书变得越来越普遍)
如果您没有支持不带“www.”的域名的 SSL 证书,那么您将无法从 进行重定向https://example.com
。只有在浏览器检查证书后才会进行重定向。用户将看到证书不匹配的错误。
最后,您需要为“有效”站点添加 VirtualHost 部分:www.example.com 上的 HTTPS(端口 443):
# Main site
<VirtualHost *:443>
ServerName www.example.com
# Put all your configuration for this site here
</VirtualHost >
测试重定向并确认其正常运行后,您可以通过在重定向中指定 301 状态(更改Redirect / https://www.example.com/
为Redirect 301 / https://www.example.com/
所有位置)并启用高速传输系统这会强制用户的浏览器记住 HTTPS 的偏好。
答案3
补充一下 thomasrutter 的回答,当我按照他的建议做的时候,我仍然遇到了问题。有时您可能需要将 SSL 信息添加到https://example.com虚拟主机。例如,当您使用 SNI 允许每个 IP 地址有多个 SSL 证书时。
如果没有它,您可能会收到 ssl_error_rx_record_too_long 错误,因为服务器将向 https 请求返回纯文本。
# Redirect https://example.com to main site
<VirtualHost *:443>
ServerName example.com
Redirect / https://www.example.com/
#for Apache Old Style (Valid on Apache <= 2.4.8) - just add in whats needed for your version
SSLEngine on
SSLCertificateFile "your certificate file.crt"
SSLCertificateKeyFile "your key file.key"
SSLCertificateChainFile "your chain file.crt"
</VirtualHost >