Лучшая практика: 301 Перенаправление HTTP на HTTPS (стандартный домен)

Я искал идеальную переадресацию 301. Но я нахожу так много решений и не знаю, что лучше.

Вот что я хочу сделать

Лучшая практика .htacess?

<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>

Это мой предпочтительный код. По крайней мере, сейчас unil.

Альтернативные способы

Я также нашел много других способов перенаправления от HTTP до HTTPS. Например:

1.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Отсутствует один шаг? И нет [R=301,L] здесь?

2.

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]

Является ли другой порядок лучше?

Должен ли я использовать

RewriteRule ^(.*)$

вместо

RewriteRule (.*)

?

3.

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} example\.com$ [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L,NE]

Имеет ли использование полного доменного имени какие-либо преимущества в производительности? Мне действительно нужно NE? ([R=301,L,NE] vs. [L,R=301])

Итак, мой вопрос ко всем экспертам: какой лучший (исполняющий) способ перенаправить как от HTTP до HTTPS, так и от до HTTPS://?

Ответ 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 без изменений, см.:

http://httpd.apache.org/docs/2.4/rewrite/flags.html

Ответ 2

Итак, конденсация, это становится:

RewriteEngine On 
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC] 
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L,NE] 

Сообщите мне, видите ли вы какие-либо ошибки

Ответ 3

    RewriteEngine On   
    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]

Ничего не менять, просто скопируйте и вставьте.