Поддержка Проблемы и решения Проблема с редиректом на HTTPS

  • Решено noindex

    (@noindex)


    Всем привет!
    На сервере настроили SSL, при наборе адреса https://www.site.ru — все работает корректно
    Решил добавить редирект с http на https через .haccess
    По адресу https://toster.ru/q/174797 нашел несколько вариантов, перепробовал все — ни один не работает.
    Во всех случаях редирект происходит, но сайт открывается жалобой на слишком большое кол-во редиректов — http://prntscr.com/evwhvh

    Начал крутить все способы более подробно.
    Один способ после некоторых манипуляций заработал, но отказали ЧПУ ссылки.
    Содержимое htaccess

    
    RewriteCond %{ENV:HTTPS} !on
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    
    </IfModule>
    
    # END WordPress
    

    Редирект на https начинает нормально работать если убрать
    RewriteEngine On
    Но при этом отказывают ссылки.
    Я в директивах htaccess понимаю слабо, скорее всего ошибка плевая, ламерская, но понять в чем она не могу…

    Заранее благодарен за помощь!

Просмотр 15 ответов — с 31 по 45 (всего 45)
  • @flector, я же пишу,

    редирект работает, если снести WP.

    Если бы апач не понимал что он уже на HTTPS, редирект и без WP не работал бы.

    Дело не в серверных настройках, а в связке «WP — директивы htaccess»

    Дело не в серверных настройках, а в связке «WP — директивы htaccess»

    если бы дело было только в wordpress и .htaccess, то для вас сработал бы любой из вариантов, который вам выше предложили. у нас ведь он работает, так?

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

    Модератор Yuri

    (@yube)

    Извините, отвлекся. Мы уже выяснили в какой переменной окружения передается наличие https?

    @flector, конечно нелогично.
    Закачиваю на домен статичный сайт из 3-х php файлов, без базы.
    Закачиваю туда такой htaccess

    
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    </IfModule>
    

    Проверяю работу по HTTPS — всё ок.
    Захожу на HTTP, получаю редирект на HTTPS — всё ок.

    Какая в данном случае проблема у хостера?
    Её нет — логично?

    Закачиваю WP.
    В htaccess добавляю строки, которые требует WP, в итоге получаем такой htaccess:

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    </IfModule>
    
    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress

    Проверяем сайт по HTTPS — все ок.
    Заходим на HTTP — получаем циклический редирект.
    Что изменилось в отличие от статично сайта?
    Поставили WP и дописали в htaccess строки, которые он требует.
    Вывод — проблема в связке «WP — директивы htaccess» — логично?

    @yube, я конечно могу ошибаться, но разве в случае нормальной работы со статичным сайтом это важно?

    Не подумайте что мне жалко, просто не понимаю какая может быть разница в какой переменной лежит признак HTTPS если без WP циклического редиректа нет, значит Apache понимает что юзер УЖЕ на HTTPS.
    Скрин из phpinfo — http://prntscr.com/ew1e4x

    Модератор Yuri

    (@yube)

    просто не понимаю какая может быть разница в какой переменной лежит признак HTTPS

    у WP есть функция is_ssl(), и она проверяет $_SERVER[‘HTTPS’] и порт 443. Если она не увидит ни одного из двух, она вернет false, и WP будет думать, что он не на SSL, а потому надо сделать редирект на https://.

    Модератор Yuri

    (@yube)

    p.s. Сам WP в принципе не может проверить, включено ли шифрование. Просто потому, что оно существует, так сказать, по другую сторону веб-сервера. WP остается только верить переменным окружения, отданным сервером.

    Ребят, что-то я запутался совсем…
    Не работают редиректы уже и на статичном сайте…

    Сейчас на сайте нативный htaccress

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

    Что ему дописать чтобы появился редирект ?%)

    Такой формат уводит сайт в цикл:

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    </IfModule>
    
    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress

    Такой формат работает с тем же эффектом:

    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteCond %{HTTP:HTTPS} !=on [NC]
    RewriteCond %{REQUEST_URI} !robots.txt
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress

    Вот еще нерабочий вариант:

    RewriteEngine On
    RewriteCond %{HTTP:SSL} !1
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L,R=301]
    
    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress

    @flector, мое мнение о том что определенные директивы работают, когда я убираю
    RewriteEngine On
    ошибочны.
    Редирект не начинает работать, просто когда я убираю это директиву и нажимаю обновить, URL в браузере УЖЕ с HTTPS.
    Поэтому создается впечатление что редирект сработал, а на самом деле просто цикличность пропала.

    Сейчас проверил все найденные ранее конструкции редиректа БЕЗ директив WP в htaccess — ниодна не сработала.
    Либо редиректа нет либо есть с зацикливанием.

    • Ответ изменён 7 лет, 1 месяц назад пользователем noindex.
    • Ответ изменён 7 лет, 1 месяц назад пользователем noindex.
    • Ответ изменён 7 лет, 1 месяц назад пользователем noindex.
    • Ответ изменён 7 лет, 1 месяц назад пользователем noindex.
    • Ответ изменён 7 лет, 1 месяц назад пользователем noindex.

    дык то, что вы там химичите с кодом wordpress в .htaccess ничего не значит, пока вы не обновите пермалинки в движке. wordpress не читает .htaccess — его читает апач. поэтому для пермалинков надо обновлять их в движке.

    @flector, еще разок.
    В какой момент и сколько раз нужно обновлять пермалинки и как?
    Я уже раз 5 обновлял и пермалинки (нажимал кнопку «сохранить») и основную страницу настроек.
    При ручном вводе HTTPS все ссылки работают корректно.
    В пермалинках такая картина: http://prntscr.com/ew27yn
    В основных настройках такая картина: http://prntscr.com/ew29a6

    В какой момент и сколько раз нужно обновлять пермалинки и как?

    при любом изменении .htaccess.
    сдается мне, что вы уже много чего наворотили — и в wp-config.php и в .htaccess и все вместе это у вас не работает.

    @flector, в wp-config.php изменения откатил, .htaccess тоже содержит только стандартные директивы WP.

    Сейчас я добавил в htaccess Ваш код, получил:

    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteCond %{HTTP:HTTPS} !=on [NC]
    RewriteCond %{REQUEST_URI} !robots.txt
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
    #BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress

    Только появляется проблема — я не могу даже попасть в админку чтобы в пермалинках нажать сохранить, возникает та же ошибка с цикличными редиректами, даже на HTTPS…

    • Ответ изменён 7 лет, 1 месяц назад пользователем noindex.

    Господа, проблема решена.
    Пришел настоящий программист, понаступав часок на мои грабли, догадался покурить сайт хостера (Мастерхост)….

    В итоге заработало так (может кому в будущем пригодится):

    RewriteEngine On
    RewriteCond %{HTTP:PORT} !^443$
    RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

    я вам сказу сказал — обратитесь к хостеру.
    он бы вам ссылочку на свой FAQ сразу бы дал.
    вы почему-то мне не поверили.

    а то, что у разных хостеров разные серверные настройки и редиректы на https настраиваются по разному — это факт. в копилку к timeweb теперь вот добавлю мастерхост с его редиректом по порту.

    Господа, проблема решена.
    Пришел настоящий программист, понаступав часок на мои грабли, догадался покурить сайт хостера (Мастерхост)….

    На всякий случай еще дадим пруфлинк
    Документация хостера по этому поводу

    @flector, да, Вы были правы.

    Но за многие годы работы, я слишком часто сталкивался с отписками саппорта в стиле «у нас всё ок, разбирайтесь в своём коде».
    Так же было время, когда я создавал и возглавлял службу поддержки, в которой помимо руководства частенько «сидел» на первой-второй линии.
    Так что знаю как это всё работает 🙂

    Поэтому перед обращением в «последнюю инстанцию» я всегда стараюсь найти железо-бетонные аргументы и перепробовать все варианты решения проблем без их участия.
    В данном случае меня сбила с толку ситуация с мнимой работой после отключения директивы RewriteEngine On
    в настройках WP.
    Казалось что правильный редирект происходит, но на самом деле просто пропадала ошибка зацикленности и открывалась страница на которую уже привел зацикленный редирект.

    А к концу дня мозг уже на столько кипел, что не мог адекватно воспринимать ситуацию.
    Если бы не @timurhamitov, думаю сейчас я бы уже писал в саппорт 🙂

    В любой случае спасибо за участие! 🙂

Просмотр 15 ответов — с 31 по 45 (всего 45)
  • Тема «Проблема с редиректом на HTTPS» закрыта для новых ответов.