SSL 证书、重定向、No-www 做对了吗(apache)?

SSL 证书、重定向、No-www 做对了吗(apache)?

我的目标

我想让网站只能通过 SSL(加密)访问,并且许多域名只重定向到一个主域名(没有重复内容),并且所有 www 变体都不应为 www。

该网站由 apache 服务器托管并配置为虚拟主机。

我希望有如下重定向:

http://example.com -> https://example.com

http://www.example.com -> https://example.com

https://www.example.com -> https://example.com

http://example.de -> https://example.com

http://www.example.de -> https://example.com

https://example.de -> https://example.com

https://www.example.de -> https://example.com

[...]

错误/问题

我的问题是某些请求(如https://www.example.de)被重定向到,https://example.com但 Firefox 等浏览器提示连接不安全(SSL_ERROR_BAD_CERT_DOMAIN)。其他一些请求可以正常工作。

我的 vhost 配置如下:

<VirtualHost *:80>
  ServerName www.example.com
  ServerAlias example.com www.example.de example.de
  RedirectMatch 301 (.*) https://example.com$1
</VirtualHost>

<VirtualHost *:443>
  ServerName www.example.com
  ServerAlias www.example.de example.de
  RedirectMatch 301 (.*) https://example.com$1
</VirtualHost>

<VirtualHost *:443>
  ServerName example.com
  ServerAdmin [email protected]
  DocumentRoot /var/www/example
  <Directory "/var/www/example">
    AllowOverride All
    AuthType Basic
    AuthName "Example.com Temporary Preview"
    AuthUserFile /var/www/users
    Require user example-dev
  </Directory>

  Include /etc/letsencrypt/options-ssl-apache.conf
  SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>

我正在使用certbot验证域并从 letsencrypt 获取 ssl 证书,如下所示:

sudo certbot --authenticator webroot --installer apache certonly

然后选择所有域(apache 安装程序可以完美猜测),在交互式 cli 安装程序中为身份验证过程指定 webroot。

(在 certbot 进程之前,我为该域使用了另一个 vhost 配置,仅使用端口 80 来使身份验证进程正常工作)

我的问题/误解

我理解我的 apache vhost 配置如下:

  • 全部捕获http请求(所有域名,带或不带 www)并重定向到https://example.com

  • 全部捕获https请求(除 之外的所有域名example.com,带或不带 www 的域名)并将其重定向到https://example.com

  • 终于赶上https请求example.com并提供 DocumentRoot 以及第三个 VirtualHost Block 中所述的所有配置。


  1. 为什么浏览器在某些情况下会抱怨证书对于给定的域无效?

  2. 有没有更好/更简单的方法来实现我想要的?我是否误解了该情况下 Apache 重定向的概念(SSL、no-www、letsencrypt)?我在使用命令时是否遗漏了某些部分certbot

答案1

您是否正在获取 example.de 的证书?即使您正在执行 301 重定向,浏览器也会首先为重定向到另一个域的域请求 SSL,例如:https://www.example.de重定向至https://example.com

所以域(https://www.example.de) 也必须具有有效的 SSL,因为它首先由浏览器请求。如果您重定向非 SSL,则不会出现这种情况http://www.example.dehttps://example.com

因此,请确保为所有 SSL 域颁发 SSL 证书。在不进行重定向的情况下测试这些域,然后实施重定向。

相关内容