Ответ 1
Чтобы начать с вашего любимого решения:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
</IfModule>
При обработке URL-адресов, отличных от https, вы перенаправляетесь на %{HTTP_HOST}
. Затем, если ваше имя хоста начиналось с "www", необходимо выполнить второе перенаправление, чтобы отправить вас из https://www.domain.tld в https://domain.tld, который должен быть вашим конечным пунктом назначения.
Вы можете сократить это, используя
RewriteRule ^(.*)$ https://domain.tld/%{REQUEST_URI} [L,R=301]
непосредственно в первом правиле. Второе правило будет применяться только к клиентам, которые пытаются получить доступ к https://www.domain.tld
.
Альтернатива 1. не работает по той же причине (отсутствует случай, когда HTTP_HOST
может быть www.domain.tld
) и дополнительно из-за отсутствия [L,R=301]
. Это необходимо, потому что вы не просто переписываете URL-адрес здесь, как вы могли бы сделать в других типах правил перезаписи. Вы запрашиваете у клиента изменение типа запроса - вот почему вы отправляете ему HTTP-код 301
.
Что касается части соответствия самого RewriteRule
, вы должны быть последовательными: если вы хотите захватить части URI, вы будете использовать регулярное выражение с круглыми скобками. Поскольку вы на самом деле используете его в целом здесь, хорошо просто использовать одну из альтернатив для "ничего", например ^
и использовать %{REQUEST_URI}
позже. Если вы используете некоторый захват (т.е. (some_regex)
, вы должны ссылаться на него в целевом объекте, используя $1
(или то, что вы собираетесь ссылаться) здесь.
В вашей третьей альтернативе снова отсутствует www + https.
Вы можете проверить, выключено ли https или если имя домена содержит ведущий "www" в одном правиле, однако условия перезаписи неявно связаны с "и".
Поэтому он должен читать:
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://domain.tld%{REQUEST_URI} [R=301,L,NE]
NE необходим для передачи на такие вещи, как GET-параметры и т.п., на новый URI без изменений, см.: