Назад | Перейти на главную страницу

htaccess правила перенаправления / перезаписи для языковой области

У меня есть многоязычный сайт на Grav CMS и два домена: grav-site.pl и grav-site.com

Я хочу перенаправить:

  1. grav-site.pl/en -> grav-site.com
  2. grav-site.com/pl -> grav-site.pl

В базе гравитационного кноляжа я нашел решение который должен работать, поэтому я добавляю это в свой .htaccess

## Begin - Multilanguage Setup
RewriteRule ^en/?$ "http://grav-site.com" [R=301,L]
RewriteRule ^pl/?$ "http://grav-site.pl" [R=301,L]

# handle sub pages, exclude admin path
RewriteCond %{REQUEST_URI} !(admin) [NC]
RewriteRule ^en/(.*)$ "http://grav-site.com/$1" [R=301,L]
RewriteCond %{REQUEST_URI} !(admin) [NC]
RewriteRule ^pl/(.*)$ "http://grav-site.pl/$1" [R=301,L]
# End - Multilanguage Setup

но когда я иду в http://grav-site.com/pl ничего не случилось (нет перенаправления) и движок CMS удалить /pl

Как изменить записи .htaccess, чтобы обеспечить правильное перенаправление?

P.S. остальная часть .htaccess https://github.com/getgrav/grav/blob/develop/webserver-configs/htaccess.txt

Я добавляю записи из сообщения выше после <IfModule mod_rewrite.c>...</IfModule>, только в конце файла

Казалось бы, это основная причина вашей проблемы. Эти директивы (перенаправления) должны располагаться ближе к началу файла, прежде чем ваши существующие перезаписи - в противном случае они никогда не будут обработаны.

"Фронт-контроллер" (в середине файла, который начинается ## Begin - Index) захватывает все запросы и направляет их через index.php (ваш «фронт-контроллер»), любые последующие директивы mod_rewrite вряд ли будут обработаны, если только запрос не относится к физическому файлу.

Как общее правило, внешние перенаправления всегда должен идти раньше внутренние перезаписи.

По той же причине я бы поставил под сомнение расположение ваших директив "безопасности" (в блоке, который начинается ## Begin - Security), который также следует за вашим передним контроллером. На самом деле это может быть нормально - они обрабатываются только для существующих файлов. Однако, опять же, как правило, директивы блокировки / безопасности обычно располагаются в верхней части файла (даже до перенаправления).

Раскомментируйте строку RewriteBase в файле .htaccess, который https://github.com/getgrav/grav/blob/develop/webserver-configs/htaccess.txt

Как перенаправить с www.example1.com на www.example2.com

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.example1.com [NC]
RewriteRule ^(.*) http://www.example2.com/$1 [L,R=301]

Перенаправление с www.example.com на example.com и наоборот

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

и наоборот

RewriteEngine On 
RewriteBase / 
RewriteCond %{HTTP_HOST} ^example.com [NC] 
RewriteRule ^(.*) http://www.example.com/$1 [L,R=301]

Редирект со всех несуществующих поддоменов на сайт:

RewriteEngine On 
RewriteBase / 
RewriteCond %{HTTP_HOST} ^(.*).example.com [NC] 
RewriteRule ^(.*)$ http://example.com/$1 [L,R=permanent]

Перенаправить все запросы веб-сайта на конкретную веб-страницу:

RewriteEngine On 
RewriteBase / 
RewriteRule ^(.*)$ http://example.com/desired_page/ [L,R=permanent]