使用虚拟主机 apache2 强制使用 https:// 和 www.

使用虚拟主机 apache2 强制使用 https:// 和 www.

我一直在寻找解决方案,以便能够使用虚拟主机强制在所有 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

http://域名.com

http://www.domain.com

https://domain.com

我在重新实现这个功能时遇到了问题,我发现如果我从 /sites-enabled 中删除 000-default.conf 符号链接,它就可以正常工作。不确定是怎么回事,但我在 DNS 端没有其他 DNS 记录,我的 Apache 执行了所有重定向,它就可以正常工作。

答案2

您需要三次重定向才能完成您想要的操作:

http://example.comhttps://www.example.com

http://www.example.comhttps://www.example.com

https://example.comhttps://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 >

相关内容