Назад | Перейти на главную страницу

mod_rewrite: на веб-странице есть цикл перенаправления

Я пытаюсь иметь параметр, который идет сразу после имени хоста, например:

www.domain.com/parameter

По этой причине я установил следующее rewriteRule для двух значений параметров, с которыми я хотел бы работать:

RewriteRule ^(en|pt)$ /index.php?language=$1&%{QUERY_STRING} [L]

Работает отлично! Хотя мне нужно создать новое правило, чтобы перенаправить любой запрос без одного из перечисленных параметров.

По этой причине я подумал, что это сработает:

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

Но, к сожалению, показывает цикл перенаправления.

Я получаю:

http://hostname/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt//

Любые советы о том, как это исправить, приветствуются!

Это потому что каталоги не обычные файлы.

http://httpd.apache.org/docs/current/mod/mod_rewrite.html (нет HTML DOM id для сниппета! ближайший - не связанный LA-U, даже то, что должно было быть id="LA-F" пропал, отсутствует!)

Вы можете выполнять различные тесты атрибутов файла:

'-d' (is directory)
Treats the TestString as a pathname and tests whether or not it exists, and is a directory.
'-f' (is regular file)
Treats the TestString as a pathname and tests whether or not it exists, and is a regular file.

Если остальная часть вашей конфигурации верна (я не уверен, что добавление завершающей косой черты - хорошая идея), вы должны добавить дополнительное условие для !-d:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(en|pt)$
RewriteRule ^(.*)$ /pt/$1/ [L,R=301]

Также подумайте о переходе на nginx! Он не только имеет более четкий синтаксис, более ориентированный на общее использование, но также имеет прямые ссылки на соответствующую документацию, например: http://nginx.org/r/if.

проверка существования файла, каталога или символической ссылки с помощью операторов «-e» и «! -e»;

%{REQUEST_URI} - это путь URI, следующий за именем хоста, поэтому он начинается с косой черты: /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/(en|pt)$
RewriteRule ^.*$ /pt/$0/ [R=301,L]