Почему.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]
Обязательно очистите кеш браузера перед тестированием.