Упрощение файла .htaccess с помощью нескольких операций перезаписи и перезаписи в нескольких доменах

#.htaccess #redirect #mod-rewrite #https #url-rewriting

Вопрос:

У меня есть несколько доменов, размещенных в одном каталоге на сервере, и каждый перенаправляет в соответствующий подкаталог. Я также перенаправляю все домены на HTTPS и удаляю WWW через .htaccess файл. Все это работает как есть, но код кажется неуклюжим, и я уверен, что его можно было бы упростить. Любые советы о том, как это сделать, как удалить все лишнее, будут оценены по достоинству.

Мне кажется, что я должен уметь универсально обрабатывать части HTTPS и не WWW, а затем нуждаться только в индивидуализации для частей домена в подкаталог. Обратите внимание, что я также перенаправляю варианты одного домена (.com и .net на адрес .org), но я предполагаю, что там не может произойти никакого упрощения.

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

 Options  FollowSymLinks
RewriteEngine on
RewriteCond %{SERVER_PORT} 80

# Canonical HTTPS/non-WWW
<IfModule mod_rewrite.c>
  RewriteCond %{HTTPS} off [OR]
  RewriteCond %{HTTP_HOST} ^www. [NC]
  RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>


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

RewriteCond %{HTTP_HOST} ^(ww .)?domainone.org
RewriteCond %{REQUEST_URI} !/domainone-org/
RewriteRule ^(.*)$ /domainone-org/$1 [L]


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

RewriteCond %{HTTP_HOST} ^(ww .)?domaintwo.com
RewriteCond %{REQUEST_URI} !/domaintwo-com/
RewriteRule ^(.*)$ /domaintwo-com/$1 [L]


RewriteCond %{HTTP_HOST} ^(www.)?domainthree.net$ [OR]
RewriteCond %{HTTP_HOST} ^(www.)?domainthree.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.domainthree.org [NC]
RewriteRule (.*) https://domainthree.org/$1 [L,R=301]

RewriteCond %{HTTP_HOST} ^(ww .)?domainthree.org
RewriteCond %{REQUEST_URI} !/domainthree-org/
RewriteRule ^(.*)$ /domainthree-org/$1 [L]
 

Я не мог заставить RewriteCond %{HTTP_HOST} ^www. [NC] его работать в разделе IfModule. Вот почему ниже для каждого домена есть то, что кажется избыточным кодом:

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

Если я попытаюсь обработать HTTPS и не WWW как две отдельные перезаписи в IfModule (см. Код ниже), то перенаправление прервется, и я получу ошибку «слишком много перенаправлений» в окне Google Chrome.

   RewriteCond %{HTTPS} off 
  RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

  RewriteCond %{HTTP_HOST} ^www. [NC]
  RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
 

Спасибо вам за вашу помощь.

Ответ №1:

Пожалуйста, не забудьте разместить эти правила в верхней части файла правил .htaccess. С вашими показанными образцами, не могли бы вы, пожалуйста, попробовать следовать. Пожалуйста, не забудьте очистить кэш вашего браузера перед тестированием ваших URL-адресов.

 Options  FollowSymLinks
RewriteEngine on

# Canonical HTTPS/non-WWW
<IfModule mod_rewrite.c>
  RewriteCond %{HTTPS} off
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

  RewriteCond %{HTTP_HOST} ^(?:www.)?(.*)$ [NC]
  RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301,NE]

</IfModule>
 


В случае, если вы хотите использовать https и не-www только для определенных доменов, попробуйте выполнить следующие действия. Пожалуйста, используйте вышеуказанные или следующие правила, установленные только в одно время.

 Options  FollowSymLinks
RewriteEngine on

# Canonical HTTPS/non-WWW
<IfModule mod_rewrite.c>
  RewriteCond %{HTTPS} off
  RewriteCond %{HTTP_HOST} ^(?:www.)?(domainone.org|domaintwo.com|domainthree(?:.net|.com))$ [NC]
  RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301,NE]

  RewriteCond %{HTTP_HOST} ^(?:www.)?(domainone.org|domaintwo.com|domainthree(?:.net|.com))$ [NC]
  RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301,NE]

</IfModule>
 

Пояснение: Добавление подробного объяснения вышеизложенного.

 ^(?:www.)?         ##Matching from starting of the value, where in a non-capturing group  matching www followed by DOT keeping it optional here.
(                   ##Starting a capturing group here.
 domainone.org     ##Matching domainone.org here.
 |                  ##OR condition to match either this or further values.
 domaintwo.com     ##Matching domaintwo.com here.
 |                  ##OR condition to match either this or further values.
 domainthree        ##Matching domainthree here.
   (?:              ##Starting a non-capturing group here.
      .net|.com   ##Matching dot net OR dot com here.
   )                ##Closing non-capturing group here.
)$                  ##Closing capturing group here.
 

Комментарии:

1. Спасибо за объяснение регулярного выражения. Я вернусь к этому в будущем. Заботиться