Я пытаюсь иметь параметр, который идет сразу после имени хоста, например:
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]