NGINX配置求助:如何通过URI末尾的8位数字匹配对应带版本号的PDF文件并提供访问
NGINX配置求助:如何通过URI末尾的8位数字匹配对应带版本号的PDF文件并提供访问
嗨,我来帮你搞定这个NGINX配置的问题~你现在的思路方向是对的,但几个细节没处理到位,导致rewrite报错,咱们一步步修正:
先说说你现有配置的几个问题
- 正则匹配范围错了:你@redirect里的正则是
^/(\d{8})$,但用户实际请求的URI是/drawings/15003915,不是/15003915,所以这个正则根本匹配不上请求,自然不会触发rewrite。 - 变量写法错误:
${$uri:1:4}这种嵌套变量NGINX不支持,而且你要提取的是8位数字的前4位,得先把那串8位数字单独抓出来再截取。 - 硬编码版本号不合理:直接rewrite到
_[A-Z].pdf太死板,你不知道实际存在的是哪个版本号,应该让NGINX自动去查找对应前缀的PDF文件。
修正后的完整配置
下面是调整后的配置,我会逐行解释逻辑:
# 拦截所有/drawings/开头的请求 location ^~ /drawings/ { # 先尝试直接访问文件/目录(比如用户输入完整PDF路径也能正常访问) # 如果不存在,跳转到@rewrite_drawing处理 try_files $uri $uri/ @rewrite_drawing; # 这里要注意:请把root设置为你服务器上Z:\drawings对应的实际路径根目录 # 比如Z盘挂载到了/mnt/drawings,那root就设为/mnt,这样/drawings/对应/mnt/drawings/ root /mnt; } # 专门处理8位数字的跳转逻辑 location @rewrite_drawing { root /mnt; # 和上面保持一致的根路径 # 正确捕获/drawings/后面的8位数字,存到$drawing_num变量里 if ($uri ~* "^/drawings/(\d{8})$") { set $drawing_num $1; # 截取8位数字的前4位作为子文件夹名,NGINX变量截取语法是${变量:起始位置:长度},起始从0开始 set $folder ${drawing_num:0:4}; # 让NGINX自动查找对应子文件夹下,以$drawing_num_开头的PDF文件 # *会匹配任意版本号(比如_D、_B),找到第一个存在的就返回,找不到就返回404 try_files /drawings/$folder/${drawing_num}_*.pdf =404; } # 如果请求不符合8位数字的格式,直接返回404 return 404; }
额外说明
- 如果你的服务器上同一个8位数字对应多个版本的PDF(比如
15003915_A.pdf、15003915_D.pdf),try_files会按照文件系统的排序返回第一个找到的文件。如果想优先返回版本号更高的(比如字母顺序靠后的),可能需要借助外部脚本或者更复杂的map配置,但如果只是要返回任意一个存在的版本,上面的配置完全够用。 - 记得把
root /mnt;替换成你服务器上Z:\drawings对应的实际路径(NGINX里要用Unix风格的斜杠/,不能用Windows的\)。
备注:内容来源于stack exchange,提问作者Sean O
相关产品推荐
相关产品推荐

