Я разрабатываю многоязычный сайт и использую идентификаторы языков в 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, а затем перенаправить для перехвата фронт-контроллера.
Кто-нибудь может мне посоветовать?Спасибо!