在 httpd 中使用 ServerName 作为 www.example.com 时出现 ERR_TOO_MANY_REDIRECTS

Posted

技术标签:

【中文标题】在 httpd 中使用 ServerName 作为 www.example.com 时出现 ERR_TOO_MANY_REDIRECTS【英文标题】:ERR_TOO_MANY_REDIRECTS while using ServerName as www.example.com in httpd 【发布时间】:2021-04-19 22:19:57 【问题描述】:

所以基本上我写了一个代码来将我所有的 http(:80) 请求重定向到 https(:443), https-redirect.conf:

<VirtualHost *:80>
ServerName example.com
#ServerAlias *example.com
Redirect permanent / https://www.example.com/
# LogLevel debug
# ErrorLog /etc/httpd/logs/error_http.log
# CustomLog /etc/httpd/logs/error_http.log combined
</VirtualHost>

起初它确实有效,即当有人键入 example.com 时它重定向到 https://www.example.com 但是当有人键入 www.example.com 它重定向到 http://www.example.com 而不是 https

所以为了克服这个问题,我在这里使用了ServerAlias *example.com(甚至ServerName www.example.com),它确实有效,但我最终得到了 ERR_TOO_MANY_REDIRECTS 谁能帮忙,我什至在任何地方都找不到合适的解释.我什至尝试寻找潜在的循环但不能。 反向代理.conf:

<VirtualHost *:80>
 ServerName example.com
 ServerAlias *example.com

 ProxyPreserveHost On
 ProxyRequests Off
 AllowEncodedSlashes NoDecode

 <Proxy *>
  Order deny,allow
  Allow from all
 </Proxy>

 RequestHeader set X-Forwarded-Proto http
 RequestHeader set X-Forwarded-Port 80

 ProxyPass "/" "http://example_ip:8080/"
 ProxyPassReverse "/" "http://example_ip:8080/"

 LogLevel debug
 ErrorLog /etc/httpd/logs/error.log
 CustomLog /etc/httpd/logs/error.log combined
</VirtualHost>

上面的代码是将 :8080 请求重定向到 :80 的代码

【问题讨论】:

【参考方案1】:

首先,你应该使用

ServerAlias *.example.com

而不是

ServerAlias *example.com

因为您想重定向您的 3 级域,而不是所有以“example.com”结尾的网络服务器。

当您创建重定向时,您需要确保有一个“排除”条件以避免任何循环:您重定向到的 url 不应触发重定向本身,否则它将创建一个循环,导致与您相同的错误'现在正面临(ERR_TOO_MANY_REDIRECTS)。此错误发生在 20 次重定向后。

您是否检查了在端口 443 上运行的应用程序是否没有重定向回 http? 您应该使用带有 '-v' 选项的 curl 来确保不会发生这种情况。

最后,“proxyPass”和“proxyPassRevers”在您希望您的服务器充当代理以让客户端连接到托管在不可公开访问的服务器或可能被防火墙保护的端口上的资源时使用。

您的配置显示“当有人在 example.com 上请求 / 时,向他显示在 example.com 的 ip 后面的服务器的端口 8080 上运行的应用程序的内容。如果 apache 使用公共 ip,您的 apache 将尝试在端口 8080 上联系该 ip(可能不是他自己的私有 ip)。根据您的网络配置方式,这现在可能有效或需要一些防火墙策略。 为避免这种情况,您可以使用在端口 8080 上运行应用程序的私有 ip,或者内部域名 apache 可以解析为正确的 ip 地址,如果您需要联系端点保留原始主机名(即www.example.com),您应该启用“ProxyPreserveHost”。

【讨论】:

一开始是ServerAlias *.example.com,当它不起作用时我改变了它。我刚刚检查了 curl -v 它没有重定向回端口 80。如果您检查代码 ProxyPreserveHost 已经启用,我是否也应该在 https-redirect.conf 中启用它。 如果 'ServerAlias *.example.com' 不起作用,您的配置/环境中存在干扰 (httpd.apache.org/docs/2.4/vhosts/name-based.html)。您应该将 ProxyPass 和 ProxyPassReverse 放在实际处理请求的 vitualhost 中,而不是放在从 http 到 https 的重定向中。正如您所写,由于应用程序没有重定向回 80/443,您应该明确检查为什么它不是并实施正确的配置/修改。 当我说 ServerAlias *.example.com 不起作用时,我的意思是它给了我 ERR_TOO_MANY_REDIRECTS,ProxyPass 和 ProxyPassReverse 在不同的 .conf 文件中,并且重定向在不同的 .conf 文件中完成。 查看我之前评论中发布的链接,显示 ServerAlias *.example.com 是有效的:如果在使用时出现问题,则表示条件匹配并启动了重定向循环。您可以提高重写日志级别以找出发生了什么:httpd.apache.org/docs/2.4/mod/mod_rewrite.html#logging

以上是关于在 httpd 中使用 ServerName 作为 www.example.com 时出现 ERR_TOO_MANY_REDIRECTS的主要内容,如果未能解决你的问题,请参考以下文章

重写 WordPress 主题文件,将所有内容重定向到 httpd.conf 中的 index.php

Linux下安装apache

启动httpd报错

十周第二次课(3月1日)

sed 指定文件中某字符串增加行

apache的配置和多站点配置