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]