You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NGINX配置求助:如何通过URI末尾的8位数字匹配对应带版本号的PDF文件并提供访问

NGINX配置求助:如何通过URI末尾的8位数字匹配对应带版本号的PDF文件并提供访问

嗨,我来帮你搞定这个NGINX配置的问题~你现在的思路方向是对的,但几个细节没处理到位,导致rewrite报错,咱们一步步修正:

先说说你现有配置的几个问题

  1. 正则匹配范围错了:你@redirect里的正则是^/(\d{8})$,但用户实际请求的URI是/drawings/15003915,不是/15003915,所以这个正则根本匹配不上请求,自然不会触发rewrite。
  2. 变量写法错误:${$uri:1:4}这种嵌套变量NGINX不支持,而且你要提取的是8位数字的前4位,得先把那串8位数字单独抓出来再截取。
  3. 硬编码版本号不合理:直接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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 11:08:04