Redirect Loop при перенаправлении всех HTTP-запросов на https с использованием .htaccess
У меня есть следующие правила в моем файле .htaccess
# to redirect http to https
RewriteCond %{HTTPS} off
RewriteRule (.*) https://www.example.com/$1 [R=301,L]
# to redirect urls with index.php to /
RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)index.php$ /$1 [R=301,L]
# to redirect non www requests to www url
RewriteCond %{HTTP_HOST} !^www\.example\.com
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
Когда я пытаюсь получить доступ к веб-сайту, он превращается в Redirect Loop. Как исправить эту проблему и правильно перенаправить?
Ответы
Ответ 1
На всякий случай у кого-то есть цикл переадресации при использовании Apache http- > https rewrite за балансировщиком нагрузки, вот решение, которое сработало для меня.
У меня была такая же проблема, когда при использовании RewriteCond% {HTTPS} off для Apache за балансировщиком нагрузки, когда балансировщик нагрузки делает вещи SSL.
Если https-версия сайта не настроена с помощью Apache ModSSL, она не устанавливает переменную% {HTTPS} в "on" и продолжает перенаправлять бесконечно.
Самое простое решение исправить это - нацелить весь трафик https на другой Apache VirtualHost (когда SSL обрабатывается балансировщиком нагрузки), который является копией основного, но имеет другой порт (скажем, 81). И в .htaccess сделайте mod_rewrite для всего, что не на порту 81:
ReWriteCond %{SERVER_PORT} !^81$
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]
Второй способ сделать это - отправить заголовок X-Forwarded-Proto из балансировщика нагрузки в Apache и использовать его в состоянии перезаписи:
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Ответ 2
Я видел много людей, страдающих переадресацией циклов при попытке использовать файлы .htaccess для перехода с http на https. И есть много разных ответов на вопрос о том, как решить эту проблему. Некоторые люди говорят:
ReWriteCond %{SERVER_PORT} 80
OR
RewriteCond %{HTTPS} off
OR
RewriteCond %{HTTPS} !on
OR (as above)
RewriteCond %{HTTP:X-Forwarded-Proto} !https
OR EVEN
RewriteCond %{HTTP:X-Forwarded-SSL} =off
но никто из них не работал у меня. В конце концов я обнаружил основную истину, что разные серверы там настроены по-разному, и все они предоставляют разные серверные переменные.
Если ни одно из вышеперечисленных действий для вас не работает, тогда фокус в том, чтобы использовать PHP, чтобы узнать, какие переменные env, которые ваш конкретный сервер отправляет вам при доступе к странице http, и какие переменные env он отправляет вам при доступе к https страницы, а затем вы можете использовать эту переменную для перенаправления. Просто создайте файл PHP (например, showphpvars.php) на вашем сервере с помощью этого кода:
<?php phpinfo() ?>
а затем просмотрите его в браузере. Найдите раздел переменных с _SERVER [ "HTTP_HOST" (и т.д.)] В нем и найдите скаута для одного, который изменяется для http против https. Шахта оказалась переменной под названием SSL, которая была установлена на 1 при использовании https и вообще не установлена при использовании http.
Я использовал эту переменную для перенаправления на https с помощью PHP, что намного лучше, чем использование htaccess, но я думаю, что к любой из переменных _SERVER можно также получить доступ с помощью htaccess, если вы хотите продолжать использовать это. Просто используйте имя внутри кавычек без бита _SERVER [""], который добавляет PHP.
Ответ 3
Для вашей информации это действительно зависит от вашего хостинг-провайдера. Он может использовать балансировщик нагрузки, как заявил Константин в другом ответе.
В моем случае (Infomaniak) ничего выше фактически не работало, и я получил бесконечный цикл перенаправления.
Правильный способ сделать это фактически объяснен на своем сайте поддержки:
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://your-domain.com/$1 [R=301,L]
Итак, всегда проверяйте у своего хостинг-провайдера. Надеюсь, у них есть статья, объясняющая, как это сделать. В противном случае просто спросите поддержку.
Ответ 4
Если вы получаете цикл переадресации, независимо от того, что вы делаете в htaccess, вместо этого выполняйте перенаправление в PHP.
Я использовал phpinfo(), например @z-m, чтобы найти переменную, которая изменяется, когда я на SSL. В моем случае это был $_SERVER ['HTTP_X_PROTO'] == "https". Если не на SSL, эта переменная не установлена.
Это код, который я использую для перенаправления с HTTP на HTTPS:
if ($_SERVER['HTTP_X_PROTO'] != "https") {
header("HTTP/1.1 301 Moved Permanently");
$location = "https://" . $_SERVER[HTTP_HOST] . $_SERVER[REQUEST_URI];
header("Location: $location");
exit;
}
Ответ 5
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{
Ответ 6
В моем случае это было:
if ($_SERVER['HTTPS'] != "on")
Ответ 7
Ничто из этого не сработало для меня, кроме этого. Мой сайт был размещен в https://www.asmallorange.com
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]