Rewrite unless resource exists

У меня есть следующее правило перезаписи, которое преобразует 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]
1
задан 14 March 2018 в 11:45
1 ответ

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

0
ответ дан 4 December 2019 в 04:14

Теги

Похожие вопросы