Делаем .htaccess более эффективным - PullRequest
1 голос
/ 27 января 2020

У меня есть .htaccess, который я собрал вместе на протяжении многих лет, используя этот сайт в качестве руководства, но надеюсь, что смогу объединить некоторые строки, чтобы сделать его более эффективным.

Эти строки выполняют три функции:

  1. Перенаправлять все не-www requests на www variant;
  2. Перенаправлять любые запросы .com в соответствующий домен .org. ;
  3. Перенаправить любой http на правильный вариант https; 3.

Вот что у меня есть:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
RewriteEngine On
RewriteCond %{http_host} ^example.com
RewriteRule ^(.*) https://www.example.org/$1 [R=301,L]
RewriteEngine On
RewriteCond %{HTTP_HOST} example\.org [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.org/$1 [R,L]

Есть ли способ объединить (хотя бы некоторые) из этих функций в меньшее количество строк?

У меня нет проблем, просто организатор во мне чувствует, что он может быть аккуратнее .....

Заранее спасибо за любые предложения!

Ответы [ 2 ]

4 голосов
/ 27 января 2020
# 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:

  • Запрос http://www.example.com/ (или https://www.example.com/)
  • Переадресация не происходит, так как запрошенный хост не соответствует rule # 1 , # 2 или # 3
  • Запрос не перенаправляется на .org (или HTTPS в случае запроса на http://...)

сценарий № 2:

  • Запрос http://example.com/ (или https://example.com/)
  • Перенаправление на https://www.example.com/ (тот же домен) по правилу № 1
  • Никаких дальнейших перенаправлений не происходит, как указано в «Сценарии № 1» выше.
  • Запрос не перенаправляется на .org.

Как видно из этих примеров, ваше правило # 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, которые у вас могут быть до этого.

Упрощенно (и «исправлено»):

  1. Перенаправить все не-www requests на www variant;
  2. Перенаправить любые запросы .com в соответствующий домен .org;
  3. Перенаправить любой 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.

0 голосов
/ 27 января 2020

Вам не нужно будет повторно писать RewriteEngine On. Достаточно одного раза.

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule ^(.*)$ https://www.example.org/$1 [R=301,L]

RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...