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