Принудительное HTTPS через .htaccess - застревание в цикле перенаправлений

13 апр. 2014 г., 23:40:34
Просмотры: 23.3K
Голосов: 4

Мой сайт WordPress находится по адресу example.com/wordpress, и мне нужно, чтобы весь контент внутри был доступен только через SSL.

Я создал правило в .htaccess для перенаправления http -> https:

RewriteEngine On
RewriteRule ^/?(.*) https://%{SERVER_NAME}/wordpress/directory/$1 [R,L]

После реализации этого правила сайт стал недоступен, так как застрял в цикле перенаправлений.

Что я делаю неправильно?

Мой файл .htaccess WordPress:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/directory/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/directory/index.php [L]
</IfModule>
0
Все ответы на вопрос 5
2

Это поздний ответ, но у меня сработало так:

Измените RewriteCond на это:

RewriteCond %{HTTP:X-Forwarded-Proto} !https

Должно выглядеть так:

RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://yourdomain.com/$1 [R,L]
19 окт. 2015 г. 18:13:19
Комментарии

Это наконец-то сработало для меня. Может кто-нибудь объяснить, почему этот RewriteCond работает, когда RewriteCond %{HTTPS} off не работает?

Peter G Peter G
25 нояб. 2015 г. 18:04:19

В некоторых случаях, если HTTPS-версия сайта не настроена через Apache ModSSL, он не устанавливает переменную %{HTTPS}

Shankar Prakash G Shankar Prakash G
12 окт. 2018 г. 22:46:45
9

Не будучи экспертом по htaccess, могу сказать, что вам не хватает RewriteCond - условия.

Проверьте, используется ли порт 80. Попробуйте это:

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^/?(.*) https://%{SERVER_NAME}/wordpress/directory/$1 [R,L]

ОБНОВЛЕНИЕ:

После просмотра вашего обновленного вопроса с полным .htaccess я бы сделал так:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/directory/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/directory/index.php [L]

RewriteCond %{HTTPS} off
RewriteRule ^/?(.*) https://%{SERVER_NAME}/wordpress/directory/$1 [R,L]
</IfModule>

Разместив ваше условие и правило под стандартными правилами WordPress.

14 апр. 2014 г. 00:51:45
Комментарии

Добавление этого в мой .htaccess не помогло, я всё ещё сталкиваюсь с той же проблемой редиректа по циклу.

SkyHiRider SkyHiRider
14 апр. 2014 г. 01:02:48

Можете скопировать ваш htaccess файл? Опубликуйте его в вопросе — я отредактирую свой ответ для новой попытки!

Frederik Spang Frederik Spang
14 апр. 2014 г. 01:04:21

Попробуйте RewriteCond %{HTTPS} off вместо условия с server_port.

Frederik Spang Frederik Spang
14 апр. 2014 г. 01:06:43

Не сработало, и весь мой файл .htaccess уже в вопросе :)

SkyHiRider SkyHiRider
14 апр. 2014 г. 01:15:33

Ох.. А где стандартные правила Wordpress для htaccess?

Frederik Spang Frederik Spang
14 апр. 2014 г. 01:16:06

Если больше ничего не помогает - попробуйте добавить RewriteEngine On снова, перед моим обновлённым ответом!

Frederik Spang Frederik Spang
14 апр. 2014 г. 01:16:42

Хм, возможно, в этом и проблема - у меня в .htaccess больше ничего нет.

SkyHiRider SkyHiRider
14 апр. 2014 г. 02:02:18

Восстановил стандартный .htaccess, но проблема не исправлена. Обновил свой вопрос.

SkyHiRider SkyHiRider
14 апр. 2014 г. 02:08:24

Обновил свой ответ - просто объединить эти два варианта тогда?

Frederik Spang Frederik Spang
15 апр. 2014 г. 15:24:50
Показать остальные 4 комментариев
0
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Источник https://www.godaddy.com/help/redirect-http-to-https-automatically-8828

11 окт. 2016 г. 04:00:03
0
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

или для отдельной страницы

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} directory
RewriteRule ^(.*)$ https://www.example.com/directory/$1 [R,L]

или можно добавить этот php-код в конкретный файл

if (!isset($_SERVER['HTTPS']) || !$_SERVER['HTTPS']) { // если запрос не защищен, перенаправляем на защищенный URL
$url = 'https://' . $_SERVER['HTTP_HOST']
. $_SERVER['REQUEST_URI'];

header('Location: ' . $url);
exit;
}

или объединить правила перезаписи WordPress с SSL..

RewriteRule ^(.*)$ https://www.example.com/directory/index\.php[R,L]
14 апр. 2014 г. 12:08:18
0

Веб-сайты, находящиеся за балансировщиками нагрузки или обратными прокси, которые поддерживают HTTP_X_FORWARDED_PROTO, можно исправить, добавив следующий код в файл wp-config.php, выше вызова require_once:

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
    $_SERVER['HTTPS'] = 'on';

или с помощью плагина

Добавьте в папку плагинов WordPress на вашем сайте, затем активируйте его в админке плагинов

<? /* Plugin Name: Установка заголовков */
if (stripos(get_option('siteurl'), 'https://') === 0) {
    $_SERVER['HTTPS'] = 'on';
    // добавляем JavaScript-обнаружение протокола страницы, и молимся!
    add_action('wp_print_scripts', 'force_ssl_url_scheme_script');
}
function force_ssl_url_scheme_script() {
    ?>
    <script>
    if (document.location.protocol != "https:") {
        document.location = document.URL.replace(/^http:/i, "https:");
    }
    </script>
    <?php
}

Источник

Это работает следующим образом:

  • http://www.exmaple.com/blog/ преобразуется в https://www.exmaple.com/blog/
  • http://www.exmaple.com/ преобразуется в https://www.exmaple.com/
3 апр. 2017 г. 09:48:44