Визуализируйте спортивное соревнование по прыжкам в три шага, в котором первые два шага идеально подходят, а третий - взлетает в воздух, никогда не возвращается и в конечном итоге терпит крушение! Вот к чему сводится этот вопрос :)
ШАГ 1: РАБОТАЕТ обслуживать /somepage?ln=xx
когда пользователь переходит к /xx/somepage
.
# if user inputs nice urls /xx/somepage to serve page /someapge?ln=xx
RewriteRule ^([a-z][a-z])/(.*) /$2?ln=$1 [L]
ШАГ 2: РАБОТАЕТ перейти на домашнюю страницу, когда указан только язык / xx /
# if language xx given but no page given? then redirect to its home /xx/home
RewriteRule ^([a-z][a-z])/?$ /$1/home [R=301,L]
ШАГ 3: АВАРИЯ
# if user inputs /somepage then redirect to default english: /en/somepage
# if user inputs /somepage?ln=xx redirect to nice url /xx/somepage
RewriteCond %{REQUEST_URI} !^/../ [NC]
RewriteRule ^(.*)$ /en/$1 [R=301,L]
Третье правило - вот где мы застряли ... PS: Перенаправление должно работать как для файлов без расширений somepage? ln = xx а также файлы с расширением somepage.abc?ln=xx где расширение может быть любым 2 или 3 символьным словом, или, если проще, проверено вручную с помощью следующих расширений, которые я использую [.php .uu .u3c .vls]
Тысяча благодарностей!
Это работает (проверено):
RewriteCond %{REQUEST_URI} !^/../ [NC]
RewriteRule ^(.*)$ /en$1 [R=301,L]
Apache Документация Mod_Rewrite, Переписать руководство, и Расширенное руководство по перезаписи.
Редактировать:
Протестировал выше (как и раньше); работает на моем сервере Apache 2.2.
Изменить 2:
Не должно быть проблем, просто нужно что-то вроде этого:
# If just the language is specified (ie example.com/en)
RewriteCond %{REQUEST_URI} ^/..$ [NC]
RewriteRule ^(.*)$ $1/
# If no language subfolder, default to 'en'
RewriteCond %{REQUEST_URI} !^/../ [NC]
RewriteRule ^(.*)$ /en$1 [R=301]
# If no page specified, default to home.
RewriteCond %{REQUEST_URI} !^/../.+ [NC]
RewriteRule ^/(..) /$1/home.html [R=301]
# If no ln query, tack it on
RewriteCond %{QUERY_STRING} !ln= [NC]
RewriteRule ^/(..)/(.*) /$1/$2?ln=$1 [R=301]
Примечание: будьте осторожны, ваша страница 404 работает правильно. Если этого не произойдет, недействительные ссылки окажутся в бесконечном цикле (т.е. страница 404 не будет работать).
Примечание 2: если пользователь вводит example.com/en
, они будут перенаправлены на example.com/en/en?ln=en
, поэтому убедитесь, что в URL-адресе стоит косая черта, иначе.
Примечание 3: если хотите, можете опустить [R=301]
из последнего правила, то пользователи увидят example.com/en/home.html
запрос к странице будет фактически example.com/en/home.html?ln=en
. Однако это не сработает, если ваш сайт использует запросы GET.
Изменить 3:
Добавлена еще одна пара условие / правило, чтобы отловить, если кто-то печатает только на языке, без косой черты.
Вот код, который я использую. Он принимает любые языки и страны.
# Tout pays de 2 digits et langue de 2 ou 3 digits ou juste la langue pas de pays - fonctionne bien et passe language et country
#www.country.com/index.html devient www.country.com/index.php
#www.country.com/fr/index.html devient www.country.com/index.php?language=fr
#www.country.com/ca/fr/index.html devient www.country.com/index.php?country=ca&language=fr
RewriteRule ^([a-zA-Z]{2})/([a-zA-Z]{2,3})/index\.html$ index.html?country=$1&language=$2
RewriteRule ^([a-zA-Z]{2,3})/index\.html$ index.html?language=$1
RewriteRule ^index\.html$ /index.php [L]