У меня есть следующий код htaccess:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond !{HTTPS} off
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
Я хочу, чтобы мой сайт перенаправлялся по https://www.
протоколу HTTPS и осуществлял принудительное использование www.
субдомена, но когда я получаю доступ http://www.
(без HTTPS), он не перенаправляет меня по https://www
HTTPS.
RewriteCond %{HTTPS} =off
Ответы:
Чтобы сначала принудительно установить HTTPS, вы должны проверить правильную переменную среды
%{HTTPS} off
, но ваше правило, приведенное выше, затем добавляется, так как уwww.
вас есть второе правило для примененияwww.
, не используйте его в первом правиле.О проксировании
При наличии некоторых форм прокси, когда клиент подключается через HTTPS к прокси, балансировщику нагрузки, приложению Passenger и т. Д.,
%{HTTPS}
Эта переменная может никогда не возникатьon
и вызывать цикл перезаписи. Это происходит потому, что ваше приложение фактически получает простой HTTP-трафик, хотя клиент и прокси-сервер / балансировщик нагрузки используют HTTPS. В этих случаях проверьтеX-Forwarded-Proto
заголовок вместо%{HTTPS}
переменной. Этот ответ показывает соответствующий процессисточник
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
URL-адрес, такой как exaple.com/?bla=%20 стал exaple.com/?bla=%2520 , то есть знак процента был закодирован. Рассмотрите возможность использования флагаNE
для предотвращения двойного кодирования:RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]
X-Forwarded-Proto
заголовок, чтобы проверить HTTPS вместо%{HTTPS}
переменной. Вы не сказали, какая часть вызывает цикл, частьwww
или HTTPS, но это первое, что приходит мне в голову.http://example.com
(например, HTTP и не www), то вы получите двойное перенаправление. Сначалаhttps://example.com
(первое правило), а затемhttps://www.example.com
(второе правило). Это можно исправить, просто изменив эти два правила, так как оба правила перенаправляют на HTTPS независимо.Ответ Михалса сработал для меня, хотя и с одной маленькой модификацией:
Проблема:
если у вас есть один сертификат безопасности сайта , браузер пытается получить доступ к вашей странице без https: // www. (или домен, на который распространяется ваш сертификат) будет отображаться уродливый красный экран с предупреждением, прежде чем он сможет получить перенаправление на безопасную и правильную страницу https.
Решение
Сначала используйте перенаправление на www (или любой домен, на который распространяется ваш сертификат), и только после этого выполняйте перенаправление https. Это гарантирует, что ваши пользователи не столкнутся ни с какой ошибкой, потому что ваш браузер видит сертификат, который не покрывает текущий URL.
источник
https://example.com
, но, по моему мнению, это наименее вероятный формат, который будет вводиться пользователем. (Принятый ответ также будет иметь ту же проблему)https://
неwww
имея при этом только сертификатаwww
, просто добавьте это правило к решению:RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI}[L,R=301]
оно просто возвращается к тому,http
когда пытается подключиться,https://example.com
чтобы избежать ошибки сертификата.http://example.com
(т.Если вы используете CloudFlare или аналогичный CDN, вы получите ошибку бесконечного цикла с решениями% {HTTPS}, представленными здесь. Если вы пользователь CloudFlare, вам нужно использовать это:
источник
=http
в!=https
наших условиях.X-Forwarded-Proto
заголовок не был объявлен, если http, так!=https
же как и хитрость{HTTPS}
не работает. Я попробовал{ENV:HTTPS}
и даже{SERVER_PORT} 443
, но в конце концов это было потому, что мне нужно было проверить наличие пользовательских заголовков HTTP-запросов Cloudflare.ПЛОХОЕ РЕШЕНИЕ И ПОЧЕМУ!
Никогда не используйте решение ниже, потому что, когда вы используете их код, это что-то вроде:
Браузер переходит к:
Затем перенаправляет на:
Затем перенаправляет на:
Это слишком большая просьба к серверу.
У большинства ответов, даже принятых один, есть эта проблема.
ЛУЧШЕЕ РЕШЕНИЕ И ОТВЕТ
Этот код имеет
[OR]
условие для предотвращения двойных изменений в URL!источник
RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
wp-content/cache/page_enhanced/
и так далее. Как я могу это исправить? Изменить: Похоже, мне нужно положить его наверху.htaccess
. Спасибо за сценарий :)Это лучший способ, который я нашел для прокси, а не пользователей прокси
источник
Есть много решений там. Вот ссылка на Apache Wiki, которая непосредственно занимается этой проблемой.
http://wiki.apache.org/httpd/RewriteHTTPToHTTPS
источник
RewriteCond %{HTTPS} off
наRewriteCond %{HTTPS} !=on
то, что перенаправление всегда будет происходить, мне кажется, это лучший ответ.Чтобы перенаправить http: // или https: // на https: // www, вы можете использовать следующее правило для всех версий apache:
Apache 2.4
Обратите внимание, что переменная% {REQUEST_SCHEME} доступна для использования начиная с Apache 2.4 .
источник
Если вы находитесь на CloudFlare, убедитесь, что вы используете что-то вроде этого.
Это избавит вас от цикла перенаправления и безопасно перенаправит ваш сайт на SSL.
PS Это хорошая идея, если проверить mod_rewrite.c!
источник
источник
Примечания: убедитесь, что вы сделали следующие шаги
Теперь ваш .htaccess будет работать, и ваш сайт будет перенаправлен с http: // на https: // www.
источник
По аналогии с решением Амира Форсати htaccess перенаправить на https: // www, но для переменного доменного имени я предлагаю:
источник
Установите в своем файле .htaccess
источник
Я использовал приведенный ниже код с этого сайта, он отлично работает https://www.freecodecamp.org/news/how-to-redirect-http-to-https-using-htaccess/
Надеюсь, поможет
источник
Я пытаюсь сначала ответить, и это не работает ... Эта работа:
источник