gpt4 book ai didi

apache - 安装 LetsEncrypt 证书后 VirtualHost 导致 ERR_TOO_MANY_REDIRECTS

转载 作者:太空宇宙 更新时间:2023-11-03 14:30:41 25 4
gpt4 key购买 nike

编辑:我从 VirtualHosts 中取出了两个不起作用的域的重定向行。重新启动 Apache 后,两个站点的 HTTP 和 HTTPS 版本都按预期工作,但它不再自动重定向(很明显)。但这些完全相同的重定向规则对 sidmandesign.com 工作正常

我正在使用 Ubuntu 将我的网络服务器从 IIS 服务器迁移到 LAMP 堆栈。我使用 certbot 为我的三个域安装了三个 SSL 证书。 Certbot 添加了一个 -le-ssl.conf 文件到 virtualhosts 目录,所以我现在在那里(所有内容都在/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 中显示此页面。

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

最佳答案

您的 RewriteCond语法

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

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

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

还有一点,RewriteCond不需要 =签名(以备将来引用):

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

删除 DocumentRoot在 VirtualHost *:80

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


多个 SSL VirtualHosts 问题

对于端口 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:443 , https://www.example2.com发送至apache:444 ,等等。但这需要在流量到达 Apache 之前完成。

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


你的情况

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

最后

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

关于apache - 安装 LetsEncrypt 证书后 VirtualHost 导致 ERR_TOO_MANY_REDIRECTS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52935109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com