Легче всего сломать то, что у вас уже есть (что делает наоборот)
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
Соответствует, когда запрос не выполняется через https ... довольно просто. [ИЛИ] в конце означает, что либо это правило, либо приведенное ниже должно возвращать true.
RewriteCond %{HTTP_HOST} !^www\. [NC]
это соответствует, если нет "www." в начале запроса (^
означает начало, !
означает «не»). [NC]
означает «nocase», поэтому просто игнорирует регистр. Не обязательно на серверах Linux, но все же рекомендуется.
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
Таким образом, если HTTPS выключен или строка не начинается с www.
, HTTP_HOST передается в это правило. Это правило всегда будет возвращать true, так как регулярное выражение соответствует необязательному «www». (из-за ?
после имени), затем один или несколько символов (.+
) до конца строки ($
).
Часть .+
после необязательного www.
заключена в скобки, чтобы захватить ее ((?:
до того, как она обозначает группу без захвата, поэтому остальная часть имени хоста захватывается как %1
- или первая захваченная группа).
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]
Затем переписывается запрос, включающий https://www.
плюс оставшуюся часть имени хоста $1
, а затем REQUEST_URI, то есть все, начиная с первого /
в URI.
Бит в конце правила также довольно прост, L
означает, что это последнее правило перезаписи, NE
означает noescape
- это полезно при включении request_uri для предотвращения его экранирования. R=301
означает перенаправление со статусом 301.
TLDR - Ваше решение
Таким образом, чтобы создать правило, которое необходимо отбросить на www., Вам нужно переключить пару из этих опций:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
На втором RewriteCond
мы удаляем !
, чтобы он соответствовал URL-адресу, который начинается с www.
, затем на RewriteRule
мы удаляем www. это добавляется в.