htaccess перенаправить на https: // www

261

У меня есть следующий код 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.

  • 0
    Должно быть RewriteCond %{HTTPS} =off
  • 1
    Если я делаю это, он перенаправляет на https: / / ww ww w w.
Показать ещё 1 комментарий
Теги:
.htaccess
redirect
mod-rewrite
https

13 ответов

568
Лучший ответ

Чтобы сначала включить HTTPS, вы должны %{HTTPS} off правильную переменную среды %{HTTPS} off, но ваше правило выше затем добавляет www. Так как у вас есть второе правило для обеспечения соблюдения www. не используйте это в первом правиле.

RewriteEngine On
RewriteCond %{HTTPS} off
# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www.
# [NC] is a case-insensitive match
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

О проксировании

Когда за некоторыми формами проксированием, посредством чего клиент подключается через HTTPS через прокси - сервер, балансировки нагрузки, пассажирского приложения и т.д., %{HTTPS} переменная никогда не может быть on и вызвать цикл перезаписи. Это связано с тем, что ваше приложение фактически получает простой HTTP-трафик, хотя клиент и балансировщик прокси/нагрузки используют HTTPS. В этих случаях проверьте заголовок X-Forwarded-Proto вместо переменной %{HTTPS}. Этот ответ показывает соответствующий процесс

  • 0
    Я думаю, что это не перенаправляет example.com на example.com :( Вы можете редактировать и исправить это также?
  • 0
    @Alexandros Это работает для этой цели. Если у вас есть дело, в котором его нет, вам может потребоваться опубликовать новый вопрос - возможно, у вас уже есть другие конфликтующие правила или конфликтующая конфигурация сервера.
Показать ещё 24 комментария
134

Ответ Michals работал у меня, хотя и с одной небольшой модификацией:

Проблема:

когда у вас есть сертификат безопасности одного сайта, браузер, который пытается получить доступ к вашей странице без https://www. (или какой-либо домен, на который распространяется ваш сертификат) отобразит уродливый красный предупреждающий экран, прежде чем он даже получит получение перенаправления на безопасную и правильную страницу https.

Решение

Сначала используйте перенаправление на www (или любой домен, на который распространяется ваш сертификат), и только затем перенаправление https. Это гарантирует, что ваши пользователи не столкнутся с какой-либо ошибкой, потому что ваш браузер видит сертификат, который не распространяется на текущий URL-адрес.

#First rewrite any request to the wrong domain to use the correct one (here www.)
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

#Now, rewrite to HTTPS:
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • 5
    +1, потому что это лучший вариант для этого сценария, но учтите, что это не предотвратит возникновение той же проблемы, если клиент заходит на https://example.com , но, по моему мнению, это наименее вероятный формат для ввода пользователем. (Принятый ответ также будет иметь ту же проблему)
  • 0
    @ Ларзан: Это неправильно. Исключение сертификации происходит только потому, что вы делаете 2 реальных перенаправления. Заменить "[L, R = 301]" на "[R = 301]". Эти правила не отменяются. L = ПОСЛЕДНИЙ
Показать ещё 4 комментария
92

Если вы используете CloudFlare или аналогичный CDN, вы получите бесконечную ошибку цикла с предлагаемыми здесь решениями {HTTPS}. Если вы являетесь пользователем CloudFlare, вам необходимо использовать это:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • 2
    Обратите внимание, что текущий совет на сайте поддержки Cloudflare немного отличается: support.cloudflare.com/hc/en-us/articles/…
  • 1
    Согласитесь с @ h0mayun, совет Cloudflare дает результаты в цикле перенаправления, тогда как этот код здесь работает отлично - спасибо!
Показать ещё 2 комментария
38

ПЛОХОЕ РЕШЕНИЕ И ПОЧЕМУ!

Никогда не используйте решение выше, потому что когда вы используете их код, это что-то вроде:

RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.example.com%{REQUEST_URI} [L,R=301]

Браузер переходит к:

http://example.com

Затем перенаправляет на:

https://example.com

Затем перенаправляет на:

https://www.example.com

Это слишком большой запрос к серверу


ЛУЧШЕЕ РЕШЕНИЕ И ОТВЕТ

Этот код имеет условие [OR] чтобы предотвратить двойные изменения в URL!

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L]

Большинство ответов даже принято, не используйте этот трюк.

  • 1
    "ПЛОХОЕ РЕШЕНИЕ И ПОЧЕМУ!" - Эти правила просто в неправильном порядке. Отмените эти два правила, и это будет правильно - вы получите только одно перенаправление, а не два.
  • 2
    Да, приведенный код приводит к двум переадресациям - я не оспариваю это - все, что я говорю, это то, что вам просто нужно отменить эти правила для решения этой проблемы, никаких других изменений не требуется. («Принятый» ответ действительно неверен - похоже, это то, на что вы ссылаетесь - директивы в неправильном порядке.)
Показать ещё 3 комментария
25

Это лучший способ найти прокси, а не прокси-пользователей

RewriteEngine On

### START WWW & HTTPS

# ensure www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

### END WWW & HTTPS
  • 0
    Исправить Это лучший способ, который я нашел для прокси, а не для прокси +1
  • 1
    Это лучший, так как он решает несколько переадресаций 301
Показать ещё 2 комментария
23

Есть много решений. Вот ссылка на wiki, которая напрямую касается этой проблемы.

http://wiki.apache.org/httpd/RewriteHTTPToHTTPS

RewriteEngine On
# This will enable the Rewrite capabilities

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS

RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e.  http://www.example.com/foo/ to https://www.example.com/foo/
# The leading slash is made optional so that this will work either in httpd.conf
# or .htaccess context
  • 6
    Это не переписывает URL на www . но он переписывает на https: //
  • 0
    Я обнаружил, изменив условие перезаписи с RewriteCond %{HTTPS} off на RewriteCond %{HTTPS} !=on этом перенаправление всегда будет происходить, мне кажется, это лучший ответ.
Показать ещё 1 комментарий
10

Чтобы перенаправить http:// или https:// на https://www вы можете использовать следующее правило для всех версий apache:

RewriteEngine on

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]

Apache 2.4

RewriteEngine on

RewriteCond %{REQUEST_SCHEME} http [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]

Обратите внимание, что переменная% {REQUEST_SCHEME} доступна для использования с apache 2.4.

  • 1
    Проблема !: Если HTTP_HOST уже содержит www. но схема не HTTPS, тогда вы в конечном итоге с www.www. в вашем хосте.
  • 0
    @ Jpsy, ты прав. Я обновил пункт назначения Redirect. Спасибо за ваш вклад.
Показать ещё 1 комментарий
8

Если вы используете CloudFlare, убедитесь, что вы используете что-то вроде этого.

# BEGIN SSL Redirect
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
# END SSL Redirect

Это избавит вас от цикла перенаправления и безопасно перенаправит ваш сайт на SSL.

P.S. Это хорошая идея, если проверить mod_rewrite.c!

  • 0
    он не перенаправляет https: // theurlwithoutwww.com на https: // www.
  • 0
    На самом деле это только рабочее решение, если у вас есть какие-то директивы add www. Другие решения дают мне «много перенаправлений».
0
RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R]
0
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

Примечания: убедитесь, что вы сделали следующие шаги

  1. sudo a2enmod переписать
  2. перезапуск службы sudo apache2
  3. Добавьте следующее в ваш vhost файл, расположенный по адресу /etc/apache2/sites-available/000-default.conf
<Directory /var/www/html>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
  Require all granted
</Directory>

Теперь ваш.htaccess будет работать, и ваш сайт будет перенаправлен с http://на https://www.

0

Я пытаюсь сначала ответить, и это не работает... Эта работа:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

# 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
0

Установите в свой файл .htaccess

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
-3

Это будет работать как для https, так и для www

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^/?(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
  • 1
    https! = on не работает на некоторых серверах и приводит к циклу перенаправления
  • 0
    Знак равенства в! = On неверен. Должно быть написано: RewriteCond %{HTTPS} !on
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню