Использование mod_rewrite для перенаправления неподдерживаемых языковых кодов - PullRequest
0 голосов
/ 28 июля 2010

Я разрабатываю многоязычный сайт и использую идентификаторы языков в URL в сочетании с фронт-контроллером, чтобы при посещении

http://www.domain.tld/en/content

или

http://www.domain.tld/de/conent

содержание локализовано на этих языках.Если сайт посещается без указания языкового идентификатора, языковые настройки браузеров пользователей определяются в качестве наилучшего предположения с помощью Accept-Language, а затем перенаправляются.Если Accept-Language не может быть обнаружен, то по умолчанию используется английский язык.Так, например, если вы посещаете

http://www.domain.tld/content

и языковые настройки вашего браузера на немецком языке, а Accept-Language обнаруживает de, вы будете перенаправлены на

http://www.domain.tld/de/content

Если ваши браузерыязыковые настройки не поддерживаются, вы будете перенаправлены на поддерживаемый по умолчанию язык: английский

http://www.domain.tld/en/content

Это работает нормально ... до тех пор, пока вы не введете URL-адрес вручную с неподдерживаемым идентификатором языка вначало URL.Чтобы объяснить, я настроил mod_rewrite таким образом, чтобы URL, которые не указывали на существующие файлы или папки, вызывали фронт-контроллер.В таком случае, если я намеренно вставил в браузер неподдерживаемый код языка, такой как 'it',

http://www.domain.tld/it/content

Вызывается фронт-контроллер, но я хочу избежать этого, вместо этого предпочитая иметьФильтр Apache запрашивает так, что на фронт-контроллере предоставляются только поддерживаемые языки.

По сути, я хочу иметь возможность определять правило так, чтобы, если URL-адрес не начинался с идентификатора поддерживаемого языка, пользователиabe перенаправляется на URL, который заменяет неподдерживаемый код языка на код по умолчанию (en), не вызывая фронт-контроллер.

Это мой файл конфигурации:

# 
#   Access rights and behaviours for DocumentRoot
#       
<Directory /WWW>
    # 
    Options +FollowSymLinks +Indexes -MultiViews

    # Allow requests for all
    Order allow,deny
    Allow from all

    # Don't use access rules defined in child directories
    AllowOverride None 

    # Define the router as the default index page
    DirectoryIndex /router.php

    # Turn on url rewriting
    RewriteEngine on    

    # If we encounter a request to document root and can detect a language preference, grab it...
    RewriteCond %{HTTP:Accept-Language} ^(en|de|fr)[-,;]? [NC,OR]
    # ... or use the default language identifier (english) ...
    RewriteCond en ^(en)$
    # ... and redirect the request to a path prefixed with the language identifier
    RewriteRule ^$ /%1/ [R=301,L]


            # Mystery rule here!


    # If the requested file does not exist...
    RewriteCond %{REQUEST_FILENAME} !-f
    # ... or if the requested directory does not exist
    RewriteCond %{REQUEST_FILENAME} !-d

    # ...forward the request to the router
    RewriteRule ^(.*)$ router.php/$1 [L]        
</Directory>

Куда я положил«Тайное правило здесь!»В комментариях мне нужно определить правило так, чтобы, если запрос uri не начинался с поддерживаемого языкового кода, это en использовалось бы на месте.

Я пытался сделать это несколькими способами, нопродолжайте падать в петли перенаправления.Например, что я пытаюсь сделать

RewriteCond %{REQUEST_URI} !^/(en|de|fr).$
RewriteRule ^$ /en/$1 [R=301,L]

Что это должно означать:

Если запрос uri не начинается с en, de или fr, возьмите оставшуюся частьURI, префикс его с en, а затем перенаправить для перехвата фронт-контроллера.

Кто-нибудь может мне посоветовать?Спасибо!

1 Ответ

2 голосов
/ 29 июля 2010

Попробуйте это правило:

RewriteRule !^(en|de|fr)/ /en%{REQUEST_URI} [R=301,L]

Это добавит /en в начале пути URI, если он еще не начинается с /en, /de или /fr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...