Назад | Перейти на главную страницу

Маршрут robots.txt требует обратной косой черты, когда находится за балансировщиком нагрузки приложения.

У меня есть сайт рельсов, использующий 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 доступен без конечной косой черты.

  1. Зачем нужна эта конечная косая черта, если экземпляр EC2 находится за балансировщиком нагрузки приложения?
  2. Как я могу настроить его так, чтобы страница загружалась без косой черты в конце?

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
  • если вы не можете выполнить перенаправление на 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 и прокси-серверами), и после удаления директивы из конфигурации сервера вы все равно можете ее наблюдать. Возможно, вам потребуется выполнить тестирование в новом анонимном окне браузера и / или очистить кеши.