У меня есть следующее правило перезаписи, которое преобразует 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
Позволяет читать каталоги как обычно. Также мой regex не учитывает имена файлов с расширениями (без точки .
), поэтому файлы типа 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
контексте) содержит абсолютный путь файловой системы к файлу / каталогу, которому соответствует запрос.
I не думайте, что вам нужно проверять наличие файлов , поскольку файл не должен соответствовать шаблону RewriteRule
^ ([A-Za-z0-9 -] +) /? $
- если у вас нет файлов без расширений?
В документах Apache вы ссылаетесь на:
RewriteCond "/ var / www / my_blog /% {REQUEST_FILENAME}"! -d
Формат этой директивы на самом деле мне не кажется правильным, учитывая, что пример показывает, что она используется в контексте каталога . (Этот формат может потребоваться в контексте сервера или виртуального хоста , когда REQUEST_FILENAME
совпадает с REQUEST_URI
- URL-путь запроса. Однако тогда эта переменная будет начинаться с косой черты , так что приведенное выше все еще неверно?!)