У меня есть сайт rails, использующий AWS ALB, и все маршруты работают, кроме одного, robots.txt.
Я получаю сообщение об ошибке «ERR_TOO_MANY_REDIRECTS», ссылка на пример: https://www.mamapedia.com/robots.txt
После некоторого исследования я обнаружил много мест, в которых говорилось, что балансировщик нагрузки отправляет трафик через HTTP к экземплярам EC2, и перенаправления могут быть вызваны, когда трафик HTTPS попадает на балансировщик нагрузки aws docs . Я настроил 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
Edit
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
Edit
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
Edit Дополнительная информация: В 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
Hit для 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. Клиент ---> HTTP ----> балансировщик нагрузки ----> HTTP ----> Ваш сервер перенаправления
|
<------- Ответ: Перенаправление на HTTPS <-
2. Клиент ---> HTTPS ----> балансировщик нагрузки ----> HTTP ----> Сервер вашего приложения
|
<------- Ответ: Данные приложения <-
возможно, балансировщик нагрузки / CDN устанавливает заголовок с исходным протоколом HTTP или HTTPS, который использует клиент, и использует наличие / отсутствие этого заголовка в качестве условия для генерации перенаправления на HTTPS.
Также обратите внимание: HTTP 301 Redirect == «Перемещено навсегда» , и поэтому даже неправильно настроенное перенаправление будет кэшироваться веб-браузерами (и, возможно, также CDN и прокси-серверами) и после вы удалили директиву из конфигурации сервера, вы все еще можете ее соблюдать. Возможно, вам потребуется выполнить тестирование из нового анонимного окна браузера и / или очистить кеш-память.