#regex #apache #.htaccess #redirect #url-rewriting
Вопрос:
Моя цель-запретить доступ ко всем точечным файлам , например .htaccess
, .env
и отправить обратно 404, но разрешить .well-known
доступ к папке letsencrypt
RewriteEngine On
RewriteRule "(^|/).(?!well-known)" - [F]
RedirectMatch 404 /..*$
Любой намек на то, как этого добиться, высоко ценится
Лучший эндо
Ответ №1:
Вместо этого попробуйте выполнить следующее:
RewriteEngine On
RewriteRule (?:^|/).[^/] $ - [R=404]
Это будет 404 для любого файла (или, скорее, последнего сегмента URL-пути), который начинается с точки. Но это позволит .well-known/
— так как это каталог, и поэтому он также снабжен по крайней мере косой чертой именем файла.
ОБНОВЛЕНИЕ: Изменено регулярное выражение, чтобы оно соответствовало точке в начале последнего сегмента пути, а не где-либо в последнем сегменте пути!
Обратите внимание, что F
флаг отвечает 403 «Запрещено», а не 404, как было запрошено.
В качестве альтернативы вы можете использовать <Files>
(или <FilesMatch>
) контейнер, который соответствует только «файлам». Например:
<Files ".*">
# 404 Not Found
Redirect 404 /
# OR... 403 Forbidden
#Require all denied
</Files>
Хотя это также блокирует запрос на /.well-known
(без завершающей косой черты) — хотя в любом случае это не совсем корректный запрос.
Комментарии:
1. Это довольно элегантный способ, тх
2. @endo.anaconda На самом деле в регулярном выражении была «ошибка», так как она соответствовала бы точке в любом месте последнего сегмента пути, а не только в начале. например
/some.thing
, также была бы заблокирована! Я обновил свой ответ (улучшенное регулярное выражение). Я также добавил альтернативное решение с использованием<Files>
контейнера.