【问题标题】:VirtualHost causing ERR_TOO_MANY_REDIRECTS after installing LetsEncrypt certificatesVirtualHost 在安装 LetsEncrypt 证书后导致 ERR_TOO_MANY_REDIRECTS
【发布时间】:2019-03-26 20:51:04
【问题描述】:

编辑:我将重定向线从虚拟主机中取出,用于两个不起作用的域。重新启动 Apache 后,两个站点的 HTTP 和 HTTPS 版本都按预期工作,但不再自动重定向(显然)。但是这些完全相同的重定向规则对 sidmandesign.com 工作正常

我正在使用 Ubuntu 将我的网络服务器从 IIS 服务器迁移到 LAMP 堆栈。我使用 certbot 为我的三个域安装了三个 SSL 证书。 Certbot 在 vi​​rtualhosts 目录中添加了一个 -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>

打捞的serendipity.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>

打捞的serendipity-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 中显示此页面。

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

【问题讨论】:

  • Include /etc/letsencrypt/options-ssl-apache.conf 包含什么?验证那里是否有其他重定向。
  • @Nic3500 不,似乎只有一些安全和 SSL 设置。与重定向无关

标签: apache ssl virtualhost


【解决方案1】:

你的 RewriteCond 语法

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

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

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

另外一点,RewriteCond 不需要= 符号(供以后参考):

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

删除 VirtualHost *:80 中的 DocumentRoot

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


多个 SSL 虚拟主机问题

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

但对于 SSL,这是行不通的。 Apache 无法读取请求的域,直到 SSL 证书与浏览器协商完成。那么它有什么作用呢?它使用它找到的第一个 *:443 VirtualHost。

解决方法是:

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

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

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


你的情况

  • 端口 80 上的请求 http://&lt;SOMEDOMAIN&gt; 被发送到正确的 VirtualHost。
  • 此 VH 将其重定向到端口 443 上的 https://&lt;SOMEDOMAIN&gt;。它应该这样做。
  • 始终使用第一个 VH,因此证书/etc/letsencrypt/live/sidmandesign.com/fullchain.pem 是发送到客户端浏览器的证书。您可以通过查看浏览器控制台并检查证书来验证这一点。
  • 因此,浏览器会看到一个域的证书,该证书与请求的域不匹配(除了第一个域之外)。

最后

对于 “Chrome 中的 ERR_TOO_MANY_REDIRECTS”,查看控制台(F12,网络选项卡,检查保留日志)。您将看到 Chrome 获得的每个重定向。这样你会看到什么在循环。我的猜测是“=”号把事情搞砸了。

【讨论】:

  • 我会看看这个SNI,看看我有没有。奇怪的部分是......如果我删除所有重定向迹象,并且每个域都有一个用于 HTTP 的 VH 和一个用于 HTTPS 的 VH,就像我目前拥有的那样,我可以手动转到 http:// 和 https://很好,正确的证书加载和一切。就在我尝试任何重定向尝试时,无论是 mod_rewrite、.htaccess 还是永久重定向,这两个域都会导致无限循环。我什至尝试了一个测试 Hello world index.html 以确保它不是页面的内容,它仍然是。
  • 嗯,好的。你试过我建议的Redirect permanent ... 方法吗?
  • 是的,我试过了。作为测试,我确实重定向了永久wwww.example.com(故意4 w)。然后,当我转到example.com 时,它重定向到wwww.example.com,所以看起来即使转到 HTTPS 版本的网站,端口 80 的 VirtualHost 仍然以某种方式关闭,我不知道这是如何或为什么.
  • 要访问 https 版本,您必须转到 https://example.com。 https的端口是443,所以80端口的VirtualHost应该不会响应。
猜你喜欢
  • 1970-01-01
  • 2018-09-20
  • 2016-08-19
  • 1970-01-01
  • 2016-08-23
  • 2021-10-21
  • 1970-01-01
  • 2021-04-04
  • 2017-03-18
相关资源
最近更新 更多