OpenBSD httpd location match规则问题:l/i/b开头请求返回404
OpenBSD httpd 配置DokuWiki URL重写问题解决
问题现象
配置OpenBSD httpd的location规则为DokuWiki做URL重写时,设置了两条规则:
- 第一条仅匹配
/lib/开头的请求 - 第二条匹配所有非
/lib/开头的请求
但实际运行中,所有小写l、i、b开头的请求均返回404,无法被第二条规则处理;大写L/I/B开头的请求则正常。即使注释第一条规则,问题依旧存在。
问题原因
原第二条规则的/([^lib])是字符集否定匹配,它仅匹配单个字符不是l、i、b的请求路径。这就导致:
- 当请求路径是
/lxxx、/ixxx、/bxxx时,第一个字符属于被否定的集合,规则不匹配 - 无匹配规则的请求直接返回404
- 大写
L/I/B不在否定字符集内,所以能正常匹配第二条规则
修正后的配置
利用Lua模式的负向预查功能实现“排除/lib/开头”的匹配逻辑,同时优化第一条规则的匹配精度:
location match "^/lib/(.*)" { request rewrite "/%1" } location match "^/(?!lib/)" { request rewrite "/doku.php?id=$DOCUMENT_URI&$QUERY_STRING" }
规则说明
- 第一条规则:
^/lib/(.*)用^锚定路径开头,确保只有严格以/lib/开头的请求才会匹配,捕获lib/之后的内容进行重写 - 第二条规则:
^/(?!lib/)是负向预查语法,匹配以/开头但后续内容**不是lib/**的所有请求,覆盖了/l、/login、/index、/blog等所有非/lib/开头的路径
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

