如何在现有Nginx反向代理环境下实现远端应用服务器PDF文件下载
Nginx反向代理开放指定PDF访问的配置方法
核心思路
完全不用改动你现有的业务转发逻辑,只要在原有server配置里,加一段优先级比location /更高的专属匹配规则就行——Nginx的匹配规则是越精确的路径优先级越高,新增的规则会优先于全量转发的/规则生效,不会影响现有业务的正常访问。
先理清最容易踩的坑
你要访问的PDF存放在10.0.0.121那台应用服务器上,不是当前运行Nginx的代理服务器的本地磁盘。很多人第一反应会在Nginx上配置root /home/ubuntu/app/pdf来指向文件路径,这完全是错误的——Nginx读文件只会遍历自己本机的文件夹,你指的路径在Nginx机器上根本不存在,配完直接报404。
具体配置修改
在你原有location /规则的同级位置,插入对应配置块即可:
单文件定向访问配置
如果只需要开放这一个PDF的访问权限,写精确匹配规则:
# 精确匹配指定PDF的访问路径 location = /downloads/data-2021-03-25.pdf { # 把这个请求转发到远端应用服务器,按应用服务器的实际服务能力调整proxy_pass路径 # 如果8000端口的业务应用本身已经能正确读取这个PDF文件,直接转过去就可以 proxy_pass http://10.0.0.121:8000/pdf/data-2021-03-25.pdf; # 强制浏览器弹出下载提示,不会直接在浏览器里渲染打开PDF add_header Content-Disposition "attachment; filename=data-2021-03-25.pdf"; # 关闭代理缓冲,大文件下载速度会更快 proxy_buffering off; }
整目录开放配置
如果后续需要开放/home/ubuntu/app/pdf/目录下所有文件的访问权限,换成前缀匹配规则即可:
# 匹配所有/pdf/开头的请求,优先级高于通用的/规则 location ^~ /pdf/ { # 举个实际场景:你在10.0.0.121的PDF目录下用极简静态服务对外(比如cd /home/ubuntu/app/pdf && python3 -m http.server 8001),就可以按下面的配置映射路径 # 外部请求 /pdf/xxx.pdf 会被转成 http://10.0.0.121:8001/xxx.pdf,刚好对应静态服务的根目录文件 proxy_pass http://10.0.0.121:8001/; proxy_buffering off; }
配置生效验证
- 改完配置先执行
nginx -t,检查有没有语法错误,避免手滑打错字符 - 确认语法没问题后,执行
nginx -s reload让配置生效,不会中断现有业务服务 - 从外部网络访问
http://你的代理服务器IP/downloads/data-2021-03-25.pdf,测试能不能正常触发PDF下载。
额外说明
- 你原有配置里的
rewrite ^/(.*) /$1 break;其实没有实际作用,也不用特意删掉,留着不影响功能 - 绝对不要在Nginx上配置指向远端服务器路径的本地root/alias规则,否则一定会触发404/403权限报错
内容的提问来源于stack exchange,提问作者Nisham
相关产品推荐
相关产品推荐

