Apache/Nginx转Caddyfile时的正则表达式问题求助
Apache/Nginx转Caddyfile:单正则实现隐藏文件访问限制
问题背景
原本在Apache和Nginx中,可通过负前瞻正则限制访问所有以点开头但不属于.well-known目录的文件/目录:
- Apache配置:
<IfModule mod_authz_core.c> <LocationMatch "(^|/)\.(?!well-known/)"> Require all denied </LocationMatch> </IfModule>
- Nginx配置:
location ~* /\.(?!well-known/) { deny all; }
转换到Caddy时,当前实现是通过两个正则配合not指令完成:
@block { path_regexp ^(/\..*)$ not path_regexp "^/\.well-known/.*$" } respond @block 403
但Caddy采用的RE2正则语法不支持负前瞻,希望仅用单个正则实现相同逻辑,避免依赖not指令。
解决思路
利用RE2支持的分支匹配(|),将规则拆分为两种需要拦截的场景,通过正向匹配覆盖所有需限制的路径,同时自动排除.well-known相关路径:
- 根目录下直接存在的隐藏文件/目录(如
/.env、/.git) - 任意子目录下的隐藏文件/目录(如
/foo/.bar)
最终Caddy配置
@block { path_regexp ^/\.(?!well-known/).*$|^/.+/\..*$ } respond @block 403
正则解释
^/\.(?!well-known/).*$:匹配根目录下以.开头,但并非.well-known/起始的路径(如/.env、/.git/config)^/.+/\..*$:匹配任意子目录下的隐藏文件/目录(如/app/.env、/blog/.htaccess)
两个分支通过|连接,完整覆盖所有需拦截的路径,同时自动豁免/.well-known/开头的合法请求。
内容的提问来源于stack exchange,提问作者obeN
相关产品推荐
相关产品推荐

