У меня есть сайт рельсов, использующий AWS ALB, и все маршруты работают, кроме одного, 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 доступен без конечной косой черты.
Httpd.config:
TraceEnable Off
ServerTokens Prod
ServerRoot "/etc/httpd"
PidFile run/httpd.pid
Timeout 600
KeepAlive On
MaxKeepAliveRequests 200
KeepAliveTimeout 600
User apache
Group apache
ServerAdmin support@mamapedia.com
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, как показано в связанном файле выше. Также один из файлов conf.d / *. Conf для конфигурации ssl прослушивает порт 443
Ранее я сказал, что не думаю, что это проблема перенаправления http -> https, но теперь я думаю, что это неправильно настроено.
Редактировать 2 При попытке решить эту проблему, новые маршруты были настроены так, чтобы указывать на файл rails robots.txt, например, был использован маршрут /robots.img, и он будет отображаться должным образом. Были использованы несколько других файловых суффиксов, и все они работали. Проблема заключалась не только в .txt, в качестве маршрута был протестирован файл human.txt, и страница отображалась должным образом. Это показывает, что проблема связана с robots.txt.
Когда я просматриваю весь каталог apache, ничего не попадает в robots.txt, robots, и только одно попадание для txt в conf.d / autoindex.conf:
AddIcon /icons/text.gif .txt
Хит для txt - это просто установка значка для файлов txt, но, поскольку другие файлы txt работают, то есть human.txt, я не думаю, что это проблема.
Как только файл robots.txt может находиться в бесконечном цикле перенаправления?
Довольно типичная причина этого бесконечного цикла перенаправления - это когда вы выполняете разгрузку SSL или завершение SSL либо на балансировщике нагрузки, либо в CDN, что приводит к тому, что весь трафик на фактический веб-сервер всегда будет простым HTTP.
Когда вы настраиваете перенаправление на 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
Решение:
если вы не можете выполнить перенаправление на HTTPS на балансировщике нагрузки / CDN, отправьте трафик, поступающий через 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.
Также обратите внимание: a HTTP 301 перенаправление == "Переехал навсегда" и поэтому даже неверно настроенное перенаправление будет кэшироваться веб-браузерами (и, возможно, также CDN и прокси-серверами), и после удаления директивы из конфигурации сервера вы все равно можете ее наблюдать. Возможно, вам потребуется выполнить тестирование в новом анонимном окне браузера и / или очистить кеши.