Правило .htaccess для многоязычного сайта

Я перепроектирую URL-адрес многоязычного сайта PHP (en | es | de | fr | ru). URL-адрес сайта:

www.mysite.com/page www.mysite.com/page/subpage1 www.mysite.com/page/subpage1/subpage2 www.mysite.com/page/subpage1/subpage2/subpage3 

До четырех уровней подкаталогов (продукты, субпродукты и т. Д.). Язык передается как параметр GET:

 www.mysite.com/page?lang=es 

или

 www.mysite.com/page/subpage1/subpage2?lang=de 

Текущий .htaccess выглядит примерно так:

 Options +FollowSymlinks +MultiViews -Indexes RewriteEngine on RewriteBase / # Redirect all versions of homepage to www.mysite.com RewriteCond %{REQUEST_URI} ^/index\.html$ RewriteRule ^index.html$ http://www.mysite.com/ [R=301,L] # Redirect non-www to www traffic RewriteCond %{HTTP_HOST} !^(www\.mysite\.com)?$ RewriteRule (.*) http://www.mysite.com/$1 [R=301,L] RewriteCond %{SCRIPT_FILENAME} !-d RewriteCond %{SCRIPT_FILENAME} !-f #Remove php extension RewriteCond %{REQUEST_URI} ^(.*).php$ RewriteRule ^(.*)$ %1 [R=301,QSA] #Here I have a lot of 301 redirections, I ommit them for this example # First level redirections RewriteRule ^([0-9a-zA-Z\-\_]+)$ view?page=$1 [L,QSA] # Second level redirections #RewriteRule ^(page1|page2|page3)\/([0-9a-zA-Z\-\+\_\,\.\(\)]+)$ view?page=$1&subpage1=$2 [L,QSA] # Third level redirections RewriteRule ^([0-9a-zA-Z\-\_]+)\/([0-9a-zA-Z\-\+\_\,\.\(\)]+)\/([0-9a-zA-Z\-\_]+)$ view?page=$1&subpage1=$2&subpage2=$3 [L,QSA] # Fourth level redirections RewriteRule ^([0-9a-zA-Z\-\_]+)\/([0-9a-zA-Z\-]+)\/([0-9a-zA-Z\-]+)\/([0-9a-zA-Z\-]+)$ view?page=$1&subpage1=$2&subpage2=$3&subpage3=$4 [L,QSA] 

Теперь я хочу перенаправить весь сайт на URL с дополнительным языковым подкаталогом, если в URL-адресе (GET) нет параметра языка (например, английский язык по умолчанию):

 www.mysite.com/page -> www.mysite.com/en/page www.mysite.com/page/subpage1 -> www.mysite.com/en/page/subpage1 

и если параметр GET передан в URL-адресе, я хочу перенаправить на правильный URL-адрес:

 www.mysite.com/page?lang=es -> www.mysite.com/es/page www.mysite.com/page/subpage1?lang=es -> www.mysite.com/es/page/subpage1 

Я рассмотрел другие подобные вопросы, но все они основаны на 301 переадресации с последним параметром ([R = 301, L]), и я боюсь, что Last недействителен для меня.

У меня есть несколько вопросов:

  1. Есть ли способ сделать .htaccess проще, не имея правила для каждого уровня?
  2. Как я могу перенаправить весь сайт на сайт www.mysite.com/en, если в URL-адрес не передан параметр lang GET?
  3. Как перенаправить на правильный локализованный сайт в соответствии с параметром lang lang (www.mysite.com/page?lang=es -> перенаправить на сайт www.mysite.com/es/page)

заранее спасибо

Вам нужны следующие дополнительные правила:

 # lang supplied in query string RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{QUERY_STRING} ^lang=([az]{2})(?:&|$) [NC] RewriteRule !^[az]{2}/ /%1/%{REQUEST_URI}? [L,NC,R=301] # lang not supplied in query string RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{QUERY_STRING} !^lang=.+(&|$) [NC] RewriteRule !^en/ /en/%{REQUEST_URI} [L,NC,R=301] 

Вы можете перенаправить весь свой сайт на английский как свой по умолчанию или в правильную локализованную версию своего сайта, выполнив что-то вроде этого:

 RewriteRule ^(en|es|de)/(.*)$ $2?lang=$1 [L,QSA] RewriteRule ^(.*)$ $1?lang=en [L,QSA]