Рейтинг:1

htaccess переписать только в корневой каталог (в общем случае)

флаг ht

Привет, я пытаюсь заставить htaccess переписываться только в том случае, если файл, символическая ссылка или каталог с таким именем отсутствуют. Что я успешно сделал с этим прямо здесь:

RewriteCond %{REQUEST_FILENAME} -s [ИЛИ]
RewriteCond %{REQUEST_FILENAME} -l [ИЛИ]
RewriteCond %{REQUEST_FILENAME} -d
Правило перезаписи ^(.+) - [PT,L]
RewriteRule ^(.*)$ index\.php?var=$1 [QSA,L]

Работает отлично, однако я хочу, чтобы это происходило только в корневом каталоге, а не в каких-либо подкаталогах. Как я могу сделать это общим способом (это означает, что я не хочу явно указывать URL-адрес в файле .htaccess)?

Рейтинг:1
флаг kz

Чтобы предотвратить обработку каких-либо директив mod_rewrite для запросов за пределами корня документа, поместите следующее правило в начало файла:

# Предотвратить дальнейшую обработку, если запрос находится за пределами корневого каталога
Правило перезаписи / - [L]

Вышеупомянутое в основном гласит, что для любого запрошенного URL-пути, содержащего косую черту, остановитесь здесь. (Это также будет перехватывать запросы, которые заканчиваются косой чертой — это проблема?)


Кроме того, вы можете сделать регулярное выражение для существующих двух правил более конкретным, чтобы оно применялось только к запросам в корневом каталоге.

Например:

# Применять правила только к запросам в корневом каталоге
RewriteCond %{REQUEST_FILENAME} -s [ИЛИ]
RewriteCond %{REQUEST_FILENAME} -l [ИЛИ]
RewriteCond %{REQUEST_FILENAME} -d
Правило перезаписи ^[^/]+$ - [L]
Правило перезаписи ^([^/]*)$ index.php?var=$1 [QSA,L]

ПТ флаг на первом правиле не требуется. И группа захвата в первом правиле тоже не требуется. Буквенные точки в замена строка не должна быть экранирована обратной косой чертой.

NB: это также не обработает запросы, которые конец с косой чертой.


Однако, если это ваши единственные правила, связанные с этим, то вы не необходимость два правила, требуется только одно, при условии, что запросы к самому корню документа отсутствуют вар URL-параметр. Например:

DirectoryIndex index.php

RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
Правило перезаписи ^([^/]+)$ index.php?var=$1 [QSA,L]

Отметим, что логика условия перевернуто.

Как уже упоминалось, запросы к корневому каталогу просто передаются index.php (по mod_dir), а не index.php?var=.

tony avatar
флаг ht
Отличный ответ, спасибо за подробный ответ. Дополнительный вопрос: что, если бы я хотел также обрабатывать запросы, которые заканчиваются косой чертой, если этот каталог не существует. это возможно?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.