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

Как добавить / игнорировать подпапку в файле htaccess?

Я создал приложение на http://url/sdf19/

У меня есть .htaccess, помещенный в / sdf19 /, содержащий RewriteRule для чистых URL-адресов.

Но я создал инструмент для создания PDF-файлов, который находится в подпапке /inc/tools. Мне нужно связать его прямо для запуска перед заголовками.

Несмотря на несколько часов поиска, попытки использовать фрагменты, генераторы и т. Д., Я не могу получить ни одного запроса на http://url/sdf19/inc/tools быть разрешенным, без использования существующего набора RewriteRule

Вот мой стартовый файл

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([a-z]+)\/?$ index.php?page=$1 [NC]
RewriteRule ^([a-z]+)\/([0-9]+)\/?$ index.php?page=$1&id=$2 [NC]
RewriteRule ^([a-z]+)\/([a-z]+)\/?$ index.php?page=$1&action=$2 [NC]
RewriteRule ^([a-z]+)\/([a-z]+)\/([0-9]+)\/?$ index.php?page=$1&action=$2&id=$3 [NC]

ВЕЩИ ПЫТАЛИСЬ

Я пытался добавить это в строку 4; RewriteCond %{REQUEST_URI} !^ inc/tools/ [NC] Это дало RewriteCond: ошибку строки неверного аргумента

Я пытался добавить это в строку 2;

RewriteCond %{REQUEST_URI} ^/inc/tools/(.*)$
RewriteRule ^.*$ - [L]

Я пробовал добавить .htaccess в /inc/tools при выключенном RewriteEngine не работало.

Я пробовал использовать тестер .htaccess, указанный в верхнем посте, но хотя мой файл (см. Выше) работает в реале, он выдает «правило не соблюдается» для всего, что там есть!

TL; DR

Желаемый результат - я могу разрешить прямой доступ к http://url/sdf19/inc/tools > все, что я пробовал до сих пор, перенаправлял на базу http://url/sdf19/

Немного обсудим ваши текущие правила ...

Я пытался добавить это в строку 4; RewriteCond %{REQUEST_URI} !^ inc/tools/ [NC] Это дало RewriteCond: ошибку строки неверного аргумента

Потому что у вас ошибочный пространство в середине CondPattern !^ inc/tools/. Однако это выражение все равно не даст правильного результата (см. Ниже).

Я пытался добавить это в строку 2;

RewriteCond %{REQUEST_URI} ^/inc/tools/(.*)$
RewriteRule ^.*$ - [L]

Вы близки к этому. Однако REQUEST_URI Переменная сервера содержит полный URL-путь, а не URL-путь относительно того, где .htaccess файл находится. Итак, это должно быть в форме:

RewriteCond %{REQUEST_URI} ^/sdf19/inc/tools/
RewriteRule ^ - [L]

Это должно быть в верхней части вашего .htaccess файл сразу после RewriteEngine On директива. В (.*)$ в конце CondPattern было лишним, как и RewriteRule шаблон ^.*$. Однако это можно записать более эффективно как одну директиву и протестировать с помощью RewriteRule шаблон вместо. Затем вы можете опустить /sdf19 подкаталог. Например:

RewriteRule ^inc/tools/ - [L]

Я пробовал добавить .htaccess в /inc/tools с RewriteEngine OFF, не сработало.

Хорошо, что должен работал. (Если, возможно, у вас нет директив mod_alias в родительском .htaccess файл, которые конфликтуют?) Итак, неясно, учитывая то, что вы указали в вопросе, почему это не так. Есть ли у вас в вашем .htaccess файл?

все, что я пробовал до сих пор, меня перенаправляют на базу http://url/sdf19/

Это также странно, потому что ничто из того, что вы пока не показывали, не привело бы к внешнему перенаправлению. Есть ли у вас в вашем .htaccess файл? Mod_alias Redirect или RedirectMatch директива возможно?

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([a-z]+)\/?$ index.php?page=$1 [NC]
RewriteRule ^([a-z]+)\/([0-9]+)\/?$ index.php?page=$1&id=$2 [NC]
RewriteRule ^([a-z]+)\/([a-z]+)\/?$ index.php?page=$1&action=$2 [NC]
RewriteRule ^([a-z]+)\/([a-z]+)\/([0-9]+)\/?$ index.php?page=$1&action=$2&id=$3 [NC]

А потенциал проблема с этими директивами в том, что RewriteCond директивы применяются только к первый RewriteRule что следует. Итак, 2-й, 3-й и 4-й RewriteRule вышеуказанные директивы выполняются безоговорочно и объясняют, почему запросы к /sdf19/inc/tools пойманы третий правило.

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

Тебя тоже не хватает L flags в этих директивах, поэтому обработка (без необходимости?) продолжается через ваш файл.

Итак, попробуйте вместо этого следующее:

# Prevent further processing if a file or directory is requested
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
 
# Route other URLs
RewriteRule ^([a-z]+)\/?$ index.php?page=$1 [NC,L]
RewriteRule ^([a-z]+)\/([0-9]+)\/?$ index.php?page=$1&id=$2 [NC,L]
RewriteRule ^([a-z]+)\/([a-z]+)\/?$ index.php?page=$1&action=$2 [NC,L]
RewriteRule ^([a-z]+)\/([a-z]+)\/([0-9]+)\/?$ index.php?page=$1&action=$2&id=$3 [NC,L]