it-swarm.com.ru

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

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

269
bigben

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

564
Michael Berkowski

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

Проблема:  

если у вас естьсертификат безопасности одного сайта, браузер, который пытается получить доступ к вашей странице без 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]
136
Larzan

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

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
93
Andrew

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

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

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]

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

44
Amir Forsati

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

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
30
llioor

Есть много решений там. Вот ссылка на Apache 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
25
Vynz

Чтобы перенаправить 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.

10
starkeen

Если вы находитесь на 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. 

Постскриптум Это хорошая идея, если проверить mod_rewrite.c!

8
Ahmad Awais

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

<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
Jackssn
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. Судо сервис 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: // to https: // www

0
Kundan roy

Установите в своем файле .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]
0
Adam Kozlowski