Я создал приложение на 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/tool
s с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]