2013-08-14 5 views
4

Мне было предложено создать существующий веб-сайт с несколькими языками.Настройка условной переадресации в htaccess

В рамках подготовки к этому я должен был переместить все существующие страницы из/пути/страницы в/EN/пути/странице

Чтобы сохранить существующие входящие ссылки теперь нужно создать Htaccess перенаправление для отправки любого запросы от их оригинальных URL-адресов к новым URL-адресам/en/path/page, но у меня возникают проблемы с тем, чтобы это работало.

Это то, что у меня есть;

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

Что я думаю предназначен для проверки запрошенный URI, и если она не начинается с/ан, то перед именем/ен на запрошенный URI ... но я, очевидно, ошибочно, так как это Безразлично» т работы.

Любая помощь приветствуется. Спасибо.

ОБНОВЛЕНИЕ. Поскольку это сайт ExpressionEngine и есть дополнительное правило, чтобы удалить index.php часть URL здесь оба правила

# Rewrite for new language based urls 
# This is to try and get all current pages going to /en/(old url) with a 301 redirect 
RewriteCond %{REQUEST_URI} !^/en(/.*)?$ 
RewriteRule ^(.*)$ /en/$1 [R=301,L] 


# Removes index.php 
RewriteCond $1 !\.(gif|jpe?g|png|ico)$ [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php/$1 [L] 

Я также попытался это с языком переписыванием после index.php один. Я все еще зацикливаюсь.

ответ

6

Что он делает, проверяя, является ли URI не точно /en, так как $ указывает конец строки сразу после en.

Попробуйте это, он проверяет, является ли URI не совсем /en или /en/ или не начинается с /en/, и если это так, он будет предварять /en/:

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

обновления Учитывая другие правила вы имеете в своем файле .htaccess, необходимо, чтобы правило языка не совпадало снова для следующего внутреннего перенаправления на /index.php..., иначе вы получите бесконечный цикл.

Там могут быть более эффективные способы, чтобы предотвратить это, однако первое, что приходит на мой взгляд, будет проверка index.php в первом условии:

RewriteCond %{REQUEST_URI} !^/(index\.php|en)(/.*)?$ 

Так что это будет вызывать правило не применять после того, как внутренняя переадресация. Но будьте осторожны, это решает проблему для этого конкретного случая, в котором внутренняя переадресация переходит на index.php!

+0

Спасибо, я пробовал это, но он все еще не совсем работает. Я думаю, что здесь есть что-то другое. Это сайт, управляемый ExpressionEngine, который также использует htaccess для удаления части index.php URL. Я обновлю свой вопрос, чтобы показать перезаписывающее устройство, которое это делает. – foamcow

+0

Последнее правило вызывает другое (внутреннее) перенаправление, а mod_rewrite снова проверит правила для этого нового URI, где первое правило будет совпадать. Я уточню свой ответ. – ndm

+0

Еще раз спасибо. Я дам это как можно скорее. – foamcow

Смежные вопросы