我有一个使用 AWS ALB 的 Rails 站点,除 robots.txt 之外,所有路由似乎都可以正常工作。
我收到错误“ERR_TOO_MANY_REDIRECTS”,链接至示例:https://www.mamapedia.com/robots.txt
经过一番研究,我发现很多地方都说负载均衡器通过 HTTP 向 EC2 实例发送流量,而当 HTTPS 流量到达负载均衡器时可能会导致重定向AWS 文档。我已按照链接中的说明配置了 apache,并且不认为这是问题所在,此外,网站上的所有其他路由都可以通过 HTTP 或 HTTPS 运行。只有 robots.txt 不运行。
如果我从负载均衡器中取出一个实例并通过 IP 访问它,则 robots.txt 页面将按预期提供。
奇怪的是,如果在 URL 末尾添加一个斜杠https://www.mamapedia.com/robots.txt/然后页面就会呈现。Apache 中没有应该添加尾部斜杠的通配符重定向,并且同样,在负载均衡器之外,robots.txt 无需尾部斜杠即可访问。
- 当 EC2 实例位于应用程序负载均衡器后面时,为什么需要这个尾随斜杠?
- 我该如何配置它,以便页面加载时不带尾部斜杠?
Httpd.配置:
TraceEnable Off
ServerTokens Prod
ServerRoot "/etc/httpd"
PidFile run/httpd.pid
Timeout 600
KeepAlive On
MaxKeepAliveRequests 200
KeepAliveTimeout 600
User apache
Group apache
ServerAdmin [email protected]
UseCanonicalName Off
DirectoryIndex index.html index.html.var
AccessFileName .htaccess
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>
TypesConfig /etc/mime.types
<IfModule mod_mime_magic.c>
MIMEMagicFile conf/magic
</IfModule>
HostnameLookups Off
LogLevel crit
LogFormat "%a %{X-Forwarded-For}i %t %D %V \"%r\" %>s %b \"%{User-agent}i\"" detailed
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
ServerSignature Off
ServerTokens Prod
AddDefaultCharset UTF-8
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddHandler php5-script .php
AddType text/html .php
Listen 80
#Listen 443
Include conf.modules.d/*.conf
Include conf.d/*.conf
编辑 更多信息:在 AWS 中,负载均衡器有两个侦听器,一个用于 http(端口:80),一个用于 https(端口:443)。它们各自转发到不同的目标组,http 目标组配置为 HTTP 和端口 80,而 https 目标组配置为 HTTPS 和端口 443
然后我在 Apache 中有一个端口 80 上的监听器,如上面的链接文件所示。此外,ssl 配置的 conf.d/*.conf 文件之一正在监听端口 443
我之前说过我不认为这是一个 http -> https 重定向的问题,但现在我认为这是配置错误。
编辑2 在尝试解决此问题时,将新路由设置为指向 rails robots.txt 文件,例如使用路由 /robots.img,这将按预期呈现。使用了一些其他文件后缀,所有文件后缀都有效。问题不只是 .txt,human.txt 被测试为路由,它按预期呈现页面。这表明该问题特定于 robots.txt
当我搜索整个 apache 目录时,没有找到与 robots.txt、robots 相关的任何内容,而只在 conf.d/autoindex.conf 中找到了一个与 txt 相关的内容:
AddIcon /icons/text.gif .txt
对 txt 的命中只是为 txt 文件设置了一个图标,但由于其他 txt 文件也可以工作,例如 human.txt,所以我不认为这是问题所在。
robots.txt 怎么会陷入无限重定向循环?
答案1
这种无限重定向循环的一个相当典型的原因是当您在负载均衡器或 CDN 上执行 SSL 卸载或 SSL 终止时,这会导致到实际 Web 服务器的所有流量始终是纯 HTTP。
当您在 Web 服务器上配置重定向到 HTTPS 时,您会遇到如下情况:
1. Client ---> HTTP ----> load balancer ----> HTTP ----> Your server
|
<------- Response: Redirect to HTTPS <-
2. Client ---> HTTPS ----> load balancer ----> HTTP ----> Your server
does SSL off-loading |
or SSL termination |
|
<------- Response: Redirect to HTTPS <-
3. Client ---> HTTPS ----> load balancer ----> HTTP ----> Your server
|
<------- Response: Redirect to HTTPS <-
4. Client ---> HTTPS ----> load balancer ----> HTTP ----> Your server
|
<------- Response: Redirect to HTTPS <-
5. Client ---> HTTPS ----> load balancer ----> HTTP ----> Your server
|
<------- Response: Redirect to HTTPS <-
... ad infinitum
解决方案是:
- 不要从你的 Web 服务器重定向到 HTTPS!在负载均衡器或 CDN 上执行此操作
如果你无法在负载均衡器/CDN 上重定向到 HTTPS,则将通过 http 到达的流量发送到单独的后端服务器,让该服务器不做任何其他事情,只是重定向到 HTTPS,这样你就避免了循环并得到如下结果:
1. Client ---> HTTP ----> load balancer ----> HTTP ----> Your redirect server | <------- Response: Redirect to HTTPS <- 2. Client ---> HTTPS ----> load balancer ----> HTTP ----> Your application server | <------- Response: Application data <-
负载均衡器/CDN 可能会使用客户端使用的原始协议 HTTP 或 HTTPS 设置标头,并使用该标头的存在/不存在作为生成到 HTTPS 的重定向的条件。
另请注意:HTTP 301 重定向 ==“永久移动”因此,即使配置不正确的重定向也会被 Web 浏览器缓存(也可能是 CDN 和代理服务器),并且在您从服务器配置中删除该指令后,您仍可能观察到它。您可能需要从新的匿名浏览器窗口进行测试和/或清除缓存。