Многоязычный сайт .htaccess - PullRequest
2 голосов
/ 03 апреля 2012

Хорошо, так что в основном эта часть .htaccess частично работает, но пока еще не полностью. У меня есть два подкаталога на моем сервере для английского и французского сайтов (подкаталогами являются en и fr соответственно). Когда пользователь вводит что-то в строку URL, я хочу, чтобы все, что он вводил, добавлялось в en или fr (в зависимости от того, какой язык пользователя по умолчанию установлен на его компьютере).

Если они введут domain.com/test (а их язык установлен на английский), я хочу, чтобы он перенаправил на domain.com/en/test/. Я ТОЛЬКО хочу, чтобы это произошло, если test - это не папка, каталог, файл или НИЧЕГО, находящееся в корневом каталоге.

Вот мой код .htaccess, который пока работает:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteCond %{HTTP:Accept-Language} ^en [NC]
RewriteRule ^(.*)$ /en/$1/ [R=301,L]

Однако проблема с моим кодом заключается в том, что если пользователь ввел что-то вроде domain.com/test/ (С косой чертой), он не будет работать, потому что у меня есть другая часть в .htaccess, которая вызывает косую черту в конце всего. Если пользователь вошел в domain.com/test.html (а это файл в корне домена), он не будет работать, потому что у меня есть другая часть в моем .htaccess, которая удаляет расширения .html.

По сути, мне нужно, чтобы это перенаправление работало абсолютно во всех ситуациях, кроме случаев, когда логически не должно.

В любом случае, если кто-нибудь из вас может помочь мне, я буду очень признателен.

1 Ответ

2 голосов
/ 03 апреля 2012

OK. Вот как я это делаю:

Всегда требуйте суффикса языка / en, / fr и т. Д. Несмотря ни на что. Так что установите это как URL GET. С помощью PHP вы можете принудительно вставить его.

RewriteRule ^([a-z]{2})/?$ index.php?language=$1
RewriteRule ^([a-z]{2})/register/?$ register.php?language=$1

С помощью PHP или любого другого сценария, который вы используете, вы можете проверить IP, автоматически установить GET для страны и / или установить сеанс. встроить сеанс во все ваши URL, поэтому все ваши ссылки имеют

$url.$lang.$pagename;

Сделать слеш необязательным с помощью /? как в приведенных выше примерах.

Я не использую {REQUEST_FILENAME}, вместо этого у меня есть список всех возможных основных URL-адресов - но вы также можете использовать {REQUEST_FILENAME}, если хотите, но вам придется учитывать реальные каталоги.

...