Если вы не используете HSTS (в этом случае вы должны реализовать два отдельных перенаправления, первое из которых - HTTP на HTTPS на одном хосте ), тогда вы можете сделать что-то вроде в верхней части вашего .htaccess
файла:
RewriteEngine On
# Redirect HTTP to HTTPS (and www to non-www)
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule (.*) https://example.com/$1 [R=302,L]
Серверная переменная HTTPS
- это альтернативный (и, возможно, более читабельный) способ проверки того, включен ли HTTPS или нет, вместо явной проверки SERVER_PORT
.
Обратите внимание, что это 302 (временное) перенаправление. Измените его на 301 (постоянный) перенаправление, только если вы проверили, что он работает нормально.
Вам нужно очистить кеш браузера перед тестированием.
Проблемы с указанными вами директивами:
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/$1 [R,L]
Это только перенаправляет HTTP на HTTPS. Он не канонизирует запрос на https://www.example.com/
. Это также временное (302) перенаправление.
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteCond %{SERVER_PORT} !^443
RewriteRule ^(.*)$ http://example.com/$1 [L, R=301]
Помимо синтаксической неверности (у вас есть пробел между флагами RewriteRule
- что приведет к 500 внутренним ошибкам сервера), это только перенаправляет www
и HTTP. Но он перенаправляет на HTTP, а не HTTPS! Следовательно, он не будет канонизировать / перенаправлять http://example.com/
или https://www.example.com
.
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteCond %{SERVER_PORT} ^443
RewriteRule ^(.*)$ https://example.com/$1 [L, R=301]
Опять же, директива RewriteRule
синтаксически недействительна по причине, указанной выше. Это только перенаправляет www
и HTTPS. Следовательно, он не будет канонизировать http://example.com/
или http://www.example.com
.