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

У меня есть следующее правило перезаписи, которое преобразует 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

У меня проблемы с выяснением, как написать эти условия.

Решение:

Префикс условия:

RewriteCond %{REQUEST_FILENAME} !-d

Позволяет читать каталоги, как обычно. Также мое совпадение с регулярным выражением не учитывает имена файлов с расширениями (без точки) .), поэтому такие файлы, как example.css будет читаться как обычно, также.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-Za-z0-9-]+)/?$ $1.html [L]

1 ответ

Решение

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

Другие вопросы по тегам