虚拟主机在安装LetsEncrypt证书后导致ERR_TOO_MANY_REDIRECTS

时间:2018-10-22 17:56:45

标签: apache ssl virtualhost

编辑:我从两个无效的域的VirtualHosts中取出了重定向行。重新启动Apache后,两个站点的HTTP和HTTPS版本均按预期工作,但不再(显然)自动重定向。但是那些完全相同的重定向规则对于sidmandesign.com来说也可以正常工作

我正在使用Ubuntu将Web服务器从IIS服务器迁移到LAMP堆栈。我使用certbot为我的三个域安装了三个SSL证书。 Certbot在虚拟主机目录中添加了-le-ssl.conf文件,因此我现在在那里(全部位于/ etc / apache2 / sites-enabled /目录中,并且在apache.conf中包含适当的包含内容):

sidmandesign.conf:

<VirtualHost *:80>
   ServerName www.sidmandesign.com
   ServerAlias sidmandesign.com
   DocumentRoot "/var/www/html/Sidman Designs/"
RewriteEngine on
RewriteCond %{SERVER_NAME} =sidmandesign.com [OR]
RewriteCond %{SERVER_NAME} =www.sidmandesign.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

sidmandesign-le-ssl.conf:

<VirtualHost *:443>
    ServerName www.sidmandesign.com
    ServerAlias sidmandesign.com
    DocumentRoot "/var/www/html/Sidman Designs"

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

augustinebuilders.conf:

<VirtualHost *:80>
   ServerName www.augustinebuilders.com
   ServerAlias augustinebuilders.com
   DocumentRoot "/var/www/html/augustine/"
RewriteEngine on
RewriteCond %{SERVER_NAME} =augustinebuilders.com [OR]
RewriteCond %{SERVER_NAME} =www.augustinebuilders.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

augustinebuilders-le-ssl.conf:

<VirtualHost *:443>
    ServerName www.augustinebuilders.com
    ServerAlias augustinebuilders.com
    DocumentRoot "/var/www/html/augustine"

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

salvagedserendipity.conf:

<VirtualHost *:80>
   ServerName www.salvagedserendipity.com
   ServerAlias salvagedserendipity.com
   DocumentRoot "/var/www/html/salvagedserendipity/"
RewriteEngine on
RewriteCond %{SERVER_NAME} =salvagedserendipity.com [OR]
RewriteCond %{SERVER_NAME} =www.salvagedserendipity.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

salvagedserendipity-le-ssl.conf:

<VirtualHost *:443>
    ServerName www.salvagedserendipity.com
    ServerAlias salvagedserendipity.com
    DocumentRoot "/var/www/html/salvagedserendipity"

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

Sidmandesign.com可以正常工作,它可以重定向到HTTPS,我可以看到所有内容。但是,当我尝试另外两个站点时,它们重定向到HTTPS,但是在Chrome中却收到了ERR_TOO_MANY_REDIRECTS,通用站点无法在Edge / IE中显示此页面。

有什么想法为什么一个域可以工作,而当配置看起来相同时另一个域却不能工作?

1 个答案:

答案 0 :(得分:0)

您的RewriteCond语法

在您的*:80 VirtualHost中,删除RedirectCondRewriteRule伪指令并添加(好,根据您的域进行调整!):

Redirect permanent / https://www.example.com

无需验证域名是否匹配,Apache只会在域匹配ServerNameServerAlias指令值的情况下使用该VirtualHost中的配置。

另一点,RewriteCond不需要=符号(以备将来参考):

RewriteCond %{SERVER_NAME} ^www.example.com$

在VirtualHost *:80中删除DocumentRoot

由于您从不为*:80 VirtualHost提供任何内容,因此应删除DocumentRoot指令。


多个SSL虚拟主机问题

对于端口80,可以定义许多VirtualHosts没问题。 Apache将查看请求的域并使用匹配的配置。

但是对于SSL,这不起作用。在使用浏览器完成SSL证书协商之后,Apache才能读取请求的域。那怎么办呢?它使用找到的第一个*:443 VirtualHost。

解决方法是:

  • 1 SSL域== 1 IP == 1仅为该IP设置了VirtualHost(即不是*:443)。这里的问题是您可能无法访问多个地址。

  • 1个SSL域== 1端口==为该端口设置了1个VirtualHost(即*:443,*:444,...)。这里的问题在于,端口443是https站点的默认端口,因此需要在浏览器中显式请求其他站点,这对于客户端来说是非常直观的。如果您的Apache前面有网络基础结构,则可以在那里更改端口。 https://www.example.com发送到apache:443https://www.example2.com发送到apache:444,依此类推。但这需要在流量到达Apache之前

  • 在Apache(https://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI)中使用SNI。


您的情况

  • 端口80上的请求http://<SOMEDOMAIN>发送到适当的VirtualHost。
  • 此VH将其重定向到端口443上的https://<SOMEDOMAIN>。应该。
  • 始终使用第一个VH,因此证书/etc/letsencrypt/live/sidmandesign.com/fullchain.pem是发送到客户端浏览器的证书。您可以通过查看浏览器控制台并检查证书来对此进行验证。
  • 浏览器因此看到一个域的证书,该证书与请求的域不匹配(除了第一个域之外)。

最后

对于“ Chrome中的ERR_TOO_MANY_REDIRECTS” ,请查看控制台(F12,“网络”标签,选中“保留日志”)。您将看到Chrome获得的每个重定向。这样,您将看到正在循环的内容。我的猜测是'='符号弄乱了事情。