У меня есть следующее правило перезаписи, которое преобразует example.com/anything/
загрузить страницу в example.com/anything.html
RewriteRule ^([A-Za-z0-9-]+)/?$ $1.html [L]
Мне нужно исключение из этого правила, когда существует физический каталог или файл. Например, если есть физический каталог по адресу example.com/test/
тогда он должен загрузить индекс из /test/
каталог, вместо того, чтобы переписывать его в example.com/test.html
Я считаю, что мне нужно переписать условия RewriteCond
с участием !-d
и !-f
похожий на:
https://httpd.apache.org/docs/2.4/rewrite/remapping.html#fallback-resource
Мне сложно понять, как записать эти условия.
Приставка к условию:
RewriteCond %{REQUEST_FILENAME} !-d
Позволяет читать каталоги в обычном режиме. Также мое совпадение с шаблоном регулярного выражения не учитывает имена файлов с расширениями (без точки .
), поэтому такие файлы, как example.css
будут также прочитаны как обычно.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-Za-z0-9-]+)/?$ $1.html [L]
Да, как вы предлагаете, вам нужен дополнительный состояние чтобы проверить, что это не каталог. Например, в .htaccess
:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-Za-z0-9-]+)/?$ $1.html [L]
Отрицательный CondPattern !-d
проверяет, что REQUEST_FILENAME
не отображается в каталог. В REQUEST_FILENAME
переменная (в каталог или .htaccess
context) содержит абсолютный путь файловой системы к файлу / каталогу, которому соответствует запрос.
Я не думаю, что тебе нужно проверять файлы, поскольку файл не должен соответствовать RewriteRule
шаблон ^([A-Za-z0-9-]+)/?$
- разве у вас есть файлы без расширений?
в Документы Apache вы ссылаетесь на:
RewriteCond "/var/www/my_blog/%{REQUEST_FILENAME}" !-d
Формат этой директивы на самом деле мне кажется неправильным, учитывая, что пример показывает, что она используется в каталог контекст. (Этот формат может потребоваться в сервер или виртуальный хост контекст, когда REQUEST_FILENAME
такой же как REQUEST_URI
- URL-путь запроса. Однако тогда эта переменная начинается с косой черты, значит, вышеизложенное все еще неверно ?!)