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.
Ответы
Ответ 1
Чтобы сначала включить 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}
. Этот ответ показывает соответствующий процесс
Ответ 2
Ответ 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]
Ответ 3
Если вы используете CloudFlare или аналогичный CDN, вы получите бесконечную ошибку цикла с предлагаемыми здесь решениями {HTTPS}. Если вы являетесь пользователем CloudFlare, вам необходимо использовать это:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Ответ 4
ПЛОХОЕ РЕШЕНИЕ И ПОЧЕМУ!
Никогда не используйте решение ниже, потому что когда вы используете их код, это что-то вроде:
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]
Ответ 5
Это лучший способ найти прокси, а не прокси-пользователей
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
Ответ 6
Есть много решений. Вот ссылка на 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
Ответ 7
Чтобы перенаправить 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.
Ответ 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!
Ответ 9
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
Примечания: убедитесь, что вы сделали следующие шаги
- sudo a2enmod переписать
- перезапуск службы sudo apache2
- Добавьте следующее в ваш 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.
Ответ 10
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R]
Ответ 11
Аналогично решению Amir Forsati перенаправление htaccess на https://www, но для переменного доменного имени я предлагаю:
RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%2%{REQUEST_URI} [R=301,L]
Ответ 12
Установите в свой файл .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]
Ответ 13
Это будет работать как для https, так и для www
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^/?(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Ответ 14
Я пытаюсь сначала ответить, и это не работает... Эта работа:
<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