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