перенаправление 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.

12 ответов


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


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]

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

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

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

при использовании кода, принятого ответ:

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]

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


существует множество решений. Вот ссылка на 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}/ [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

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

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

для перенаправления 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 .


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


установить в ваш .htaccess файл

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

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

<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

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/ [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: / / to https://www


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

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^/?(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]