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

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

  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

Edit

  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

Edit

  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

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 находиться в бесконечном цикле перенаправления?

1
задан 19 September 2018 в 22:38
1 ответ

Достаточно типичной причиной этого бесконечного цикла перенаправления является разгрузка 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.  Клиент ---> HTTP ----> балансировщик нагрузки ----> HTTP ----> Ваш сервер перенаправления
      |
      <------- Ответ: Перенаправление на HTTPS <-
    
    2. Клиент ---> HTTPS ----> балансировщик нагрузки ----> HTTP ----> Сервер вашего приложения
      |
      <------- Ответ: Данные приложения <-
     
  • возможно, балансировщик нагрузки / CDN устанавливает заголовок с исходным протоколом HTTP или HTTPS, который использует клиент, и использует наличие / отсутствие этого заголовка в качестве условия для генерации перенаправления на HTTPS.


Также обратите внимание: HTTP 301 Redirect == «Перемещено навсегда» , и поэтому даже неправильно настроенное перенаправление будет кэшироваться веб-браузерами (и, возможно, также CDN и прокси-серверами) и после вы удалили директиву из конфигурации сервера, вы все еще можете ее соблюдать. Возможно, вам потребуется выполнить тестирование из нового анонимного окна браузера и / или очистить кеш-память.

0
ответ дан 4 December 2019 в 03:40

Теги

Похожие вопросы