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

Перепишите, если ресурс не существует

У меня есть следующее правило перезаписи, которое преобразует 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-путь запроса. Однако тогда эта переменная начинается с косой черты, значит, вышеизложенное все еще неверно ?!)