Почему.htaccess переписывает правила, которые прекрасно работают в других местах, чтобы создать циклы перенаправления?

Я пытаюсь форсировать не www + https в.htaccess на экземпляре AWS EC2.

Хотя здесь, в Stackru, существует множество явно работающих решений, все они создают для меня только циклы перенаправления.

Я получаю цикл перенаправления, когда я пытаюсь это правило:

RewriteEngine on
#RewriteCond %{HTTP_HOST} ^(www\.)(.+) [OR]
#RewriteCond %{HTTPS} off
#RewriteCond %{HTTP_HOST} ^(www\.)?(.+)
#RewriteRule ^ https://%2%{REQUEST_URI} [R=301,L]

(через Force non-www и https через htaccess)

То же самое для этого:

RewriteEngine on
#RewriteCond %{HTTP_HOST} !^domain.com$ [NC]
#RewriteRule ^(.*)$ https://domain.com/$1 [L,R=301]

#RewriteCond %{HTTPS} off
#RewriteRule ^(.*)$ https://domain.com/$1 [R,L]

Кажется, что оба работают для соответствующего OP, и, как указано в некоторых комментариях, они работают и для других.

У меня установлены следующие виртуальные хосты httpd.conf:

NameVirtualHost *:80
Listen 8443
NameVirtualHost *:8443

<VirtualHost *:80 *:8443>
    ServerAdmin webmaster@domain.com
    DocumentRoot /var/www/domain.com
    ServerName domain.com
    ServerAlias *.domain.com
    ErrorLog logs/domain.com-error_log
    CustomLog logs/domain.com-access_log common
</VirtualHost>

Для контекста: Порт:8443 получает трафик от AWS ELB (балансировщик нагрузки), который направляет:443 SSL-запросов на этот конкретный порт, потому что сертификат SSL установлен на самом балансировщике нагрузки.

В чем может быть проблема с циклами перенаправления?

2 ответа

Решение

За балансировщиком нагрузки приходится обращаться с вещами по-разному. Вы не будете проверять https обычным способом из-за разгрузки SSL с вашим LB. Вам нужно будет проверить X-Forwarded-Proto

Попробуйте эти правила и посмотрите, как они работают.

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{SERVER_NAME} ^(www\.)?(.*)$ [NC]
RewriteRule ^.*$ https://%2%{REQUEST_URI} [R=301,L]

Чтобы избежать цикла перенаправления, вы можете использовать это правило:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\. [NC,OR]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=302,L,NE]

Обязательно очистите кеш браузера перед тестированием.

Другие вопросы по тегам