htaccess перенаправляет не www на www с SSL / HTTPS

10

Я хочу переписать правило, которое перенаправляет все на https:// AND www .

Например, http://example.comдолжен идтиhttps://www.example.com

Вот что у меня есть:

RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteRule ^(.*)$ "https\:\/\/www\.example\.com\/$1" [R=301,L]
Будет
источник

Ответы:

11

Я нашел решение.

Без HSTS (однократное перенаправление):

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

С HSTS (двойное перенаправление):

RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Будет
источник
1
Обратите внимание, что это приведет к двойному перенаправлению при запросе http://example.com(т. Е. HTTP и без www), поскольку сначала оно будет перенаправлено на HTTPS на том же хосте (т. Е. Без www), а затем перенаправлено wwwв качестве второго перенаправления. Вы можете исправить это, просто изменив эти два правила.
MrWhite
@MrWhite @ вы действительно хотите двойное перенаправление при правильном https://перенаправлении, особенно если вы используете HSTS. Таким образом, ваши настройки HSTS могут быть сохранены браузером для обоих ваших доменов, и последующие запросы всегда будут по умолчаниюhttps://
xsrf
@xsrf Все еще "правильно" (и более эффективно) иметь один редирект www и HTTPS. Его нужно хранить отдельно, только когда вы внедряете HSTS.
MrWhite
Оба хороших момента от xsrf и MrWhite. Я обновил ответ.
Будет
@xsrf Я проверил двойное перенаправление с помощью htaccess.madewithlove.be, и кажется, что он перенаправляет только http: //> https: // не www .
Будет
6

Ваши условия неявно AND'd и ваше второе условие всегда будет истинным (если у вас нет других доменов), поэтому ваши текущие правила будут перенаправлять только трафик не-SSL.

Вам необходимо выполнить ORусловия и отменить www(второе) условие:

RewriteEngine On
RewriteCond %{SERVER_PORT} !=443 [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Если значение SERVER_PORTне равно 443 (т. Е. Не HTTPS) или хост не запускается www.(т. Е. Вы обращаетесь к пустому домену), тогда перенаправьте на канонический URL-адрес.

Однако будет ли перенаправление https://example.comна https://www.example.comэто, зависит от вашего сертификата безопасности. (Ваш сайт должен быть доступен как через www, так и без www через SSL для перенаправления .htaccess.)

MrWhite
источник
1

Это будет использоваться как для www, так и для не www

Пример: http://domain.comперенаправление наhttps://domain.com

или Если вы пытаетесь открыть ссылку с не-www, то URL перенаправить на https с не-www

Пример: http://www.domain.comперенаправление наhttps://www.domain.com

RewriteEngine on

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Аджай Патидар
источник
Это не обрабатывает переадресацию без www на www, как указано в вопросе.
MrWhite
Вы можете добавить эту строку в htaccess RewriteCond% {HTTP_HOST}! ^ Www \. RewriteRule ^ (. *) $ % {HTTP_HOST} / $ 1 [R = 301, L]
Аджай Патидар
Заменить RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] наRewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [R=301,L]
Аджай Патидар
Вы можете редактировать свой ответ.
MrWhite