Принудительно указать язык в URL. Если URL-адрес не имеет языка, перенаправить на основе языка браузера.

Я только что перевел свой сайт. По причинам SEO (чтобы избежать дублирования контента) я хочу, чтобы КАЖДЫЙ URL-адрес содержал язык. Например, www.racebooking.net/page.php должно стать www.racebooking.net/en/page.php. Затем часть /en/ будет преобразована в ?lang=en.

Кроме того, пользователь должен иметь возможность выбрать предпочитаемый язык при просмотре веб-сайта.

Логика, которую я пытаюсь реализовать, следующая:

  • ЕСЛИ URL-адрес racebooking.net/en/page.html, просто перейдите на page.html?lang=en независимо от того, на каком языке работает мой браузер.
  • ЕСЛИ URL-адрес racebooking.net/it/page.html, просто перейдите на page.html?lang=it независимо от того, на каком языке работает мой браузер.
  • ЕСЛИ URL-адрес racebooking.net/page.html, проверьте язык браузера. Если итальянский, преобразовать URL-адрес в racebooking.net/it/page.html и перейти к page.html?lang=it, в любом другом случае преобразовать URL-адрес в racebooking.net/en/page.html и перейти к page.html?lang=en

Я написал это htaccess

RewriteCond %{THE_REQUEST} !^[A-Z]{3,}\s/[en|it]{1,1}/(.*)$ [NC]
RewriteCond %{HTTP:Accept-Language} ^it [NC]
RewriteRule ^$ /it/%1 [L,QSA,NC]

RewriteCond %{THE_REQUEST} !^[A-Z]{3,}\s/[en|it]{1,1}/(.*)$ [NC]
RewriteRule ^$ /en/%1 [L,QSA,NC]

Но ничего не происходит... он не обнаруживает отсутствие /en/ или /it/! Похоже, первого RewriteCond не происходит...

Более того, это выглядит как конфликт с этим правилом.

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

Есть идеи?

РЕДАКТИРОВАНИЕ После долгого обсуждения @anubhava решил проблему! Его решение работает отлично. Итак, я отредактировал свой вопрос, чтобы сделать его более полезным для посетителей.


person Alberto Fontana    schedule 13.12.2013    source источник


Ответы (1)


Ваше регулярное выражение неверно, особенно. эта часть [en|it], которая в основном соответствует буквам e, n, | , i, t, поскольку это класс символов.

Вместо этого попробуйте эти правила:

DirectoryIndex index.php

RewriteEngine on

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

# remove index.php from URL
RewriteCond %{THE_REQUEST} /index\.php [NC]
RewriteRule ^(.*?)index\.php$ /$1 [L,R=301,NC,NE]

# redirect first visitors basing on their language or redirect if language not specified
# in URL. If italian, redirect to italian
# if lang is Italian use it
RewriteCond %{THE_REQUEST} !\s/(it|en)/ [NC]
RewriteCond %{HTTP:Accept-Language} ^it [NC]
RewriteRule ^ /it%{REQUEST_URI} [L,NC,R=301]

# otherwise use English
RewriteCond %{THE_REQUEST} !\s/(it|en)/ [NC]
RewriteRule ^ /en%{REQUEST_URI} [L,NC,R=301]

# populate ?lang query parameter
RewriteRule ^(en|it)/(.*)$ $2?lang=$1 [L,QSA,NC]
person anubhava    schedule 13.12.2013
comment
Я попробовал ваше решение, но я получаю внутреннюю ошибку сервера! - person Alberto Fontana; 13.12.2013
comment
Была опечатка, я ее исправил. Также есть ли у вас какое-либо другое правило перезаписи ИЛИ любой другой .htaccess в вашей системе? - person anubhava; 13.12.2013
comment
Да на самом деле у меня много правил! Ваше правило выглядит хорошо, но я все еще получаю сообщение об ошибке сервера... Кстати, я определил пару правил, которые могут конфликтовать... потому что у меня есть правило, которое преобразует URL-адреса с /en/ в URL-адреса с ?lang=en Вот часть htaccess с конфликт: pastebin.com/sEJ6qBDx вы можете увидеть, где конфликт и как его исправить? - person Alberto Fontana; 14.12.2013
comment
Могу ли я узнать цель последнего правила: RewriteRule ^(en|it)/(.*)$ $2?lang=$1 [L,QSA,NC] ? - person anubhava; 14.12.2013
comment
Также являются ли каталоги /en/ и /it/ реальными? - person anubhava; 14.12.2013
comment
Это хороший вопрос! Нет, /en/ и /it/ не являются подкаталогами! Цель правила, которое вы запрашиваете, — преобразовать URL-адреса с /en/ в URL-адреса с ?lang=en. Моя система перевода просто основана на параметре GET lang. т.е. если $_GET['lang']=="en" страница переведена на английский язык.. Чтобы избежать уродливых URL-адресов с параметрами, я решил вставить язык в URL-адрес. Я всегда указываю на один и тот же файл, независимо от того, на каком языке я просматриваю! Вот почему я написал это правило - person Alberto Fontana; 14.12.2013
comment
давайте продолжим обсуждение в чате - person anubhava; 14.12.2013