我的目标
我想让网站只能通过 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 中所述的所有配置。
为什么浏览器在某些情况下会抱怨证书对于给定的域无效?
有没有更好/更简单的方法来实现我想要的?我是否误解了该情况下 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.de到https://example.com。
因此,请确保为所有 SSL 域颁发 SSL 证书。在不进行重定向的情况下测试这些域,然后实施重定向。