# Rule #1
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
# Rule #2
RewriteCond %{http_host} ^example.com
RewriteRule ^(.*) https://www.example.org/$1 [R=301,L]
# Rule #3
RewriteCond %{HTTP_HOST} example\.org [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.org/$1 [R,L]
Да, ваши правила могут быть оптимизированы. Не в последнюю очередь потому, что они на самом деле не делают то, что вы говорите, они делают!
(я предполагаю, что вы не собираетесь внедрять HSTS ?)
Перенаправить любые запросы .com к соответствующему домену .org;
Эти директивы фактически не перенаправляют вариант .com
на .org
, как вы предлагаете во втором требование. Если вы видите это перенаправление, то это не из-за этих директив. Скорее всего, это делает сам WordPress, позже в запросе.
Например ...
Сценарий # 1:
сценарий № 2:
Как видно из этих примеров, ваше правило # 2 (соответствует example.com
только) на самом деле ничего не делает. Это всегда обойдено , потому что rule # 1 уже перенаправило запрос на поддомен www
. Было бы «лучше», если бы правило # 1 и # 2 были изменены, однако это не решило бы проблему при запросе www.example.com
(www subdomain), поскольку ничего не произошло бы до сих пор.
Другие примечания:
- Правило № 3 - Перенаправление с HTTP на HTTPS - это временное (302) перенаправление. Это должен быть 301, как и другие.
- Не нужно повторять директиву
RewriteEngine On
. Только требуется , чтобы один раз появиться в файле. (Это часто повторяется, когда .htaccess
файлы редактируются «машиной», а не кодом «вручную».) Для удобства чтения это должно быть в верхней части файла. Однако, если у вас есть несколько директив RewriteEngine
, то на самом деле экземпляр last выигрывает и контролирует весь файл (который может быть не интуитивным). например. Если вы поместите директиву RewriteEngine Off
в самый конец файла .htaccess
, тогда ... она отключена для всего файла, несмотря на любые директивы RewriteEngine
, которые у вас могут быть до этого.
Упрощенно (и «исправлено»):
- Перенаправить все не-www requests на www variant;
- Перенаправить любые запросы .com в соответствующий домен .org;
- Перенаправить любой http на правильный вариант https; 3
Эти 3 требования выполняются только в том случае, если все перенаправляется на www
+ .org
+ HTTPS. ie. Все должно перенаправляться на https://www.example.org/
(канонический URL).
Итак, ваши существующие 3 правила могут быть сведены к одному правилу, чтобы удовлетворить ваши 3 требования. ie. Если запрос не для https://www.example.org/
, то перенаправить на https://www.example.org/
.
RewriteEngine On
# If not the canonical host OR not HTTPS then redirect to HTTPS + canonical host
RewriteCond %{HTTP_HOST} !^www\.example\.org$ [OR]
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://www.example.org/$1 [R=301,L]
Здесь нам вообще не нужно ссылаться на example.com
, поскольку нас интересует только, является ли это не канонический хост.
И, поскольку это сайт WordPress, это перенаправление должно go перед фронт-контроллером WP, в верхней части файла .htaccess
.