Nginx代理外部CDN媒体链接出现HTTP 404错误的解决方法
解决Nginx反向代理Cloudinary资源出现404的问题
我来帮你排查这个问题——你遇到的404其实是两个配置错误叠加导致的,咱们一步步来修正:
问题根源分析
try_files指令阻断了反向代理:你当前的location /块里,try_files $uri $uri/ 404;会让Nginx先去本地root目录寻找对应文件,找不到就直接返回404,根本不会执行后面的proxy_pass逻辑。而你的需求是把所有请求都转发到Cloudinary,这个指令完全没必要,甚至起了反作用。- Host请求头设置错误:Cloudinary的服务器依赖请求的
Host头来定位资源,你现在设置的proxy_set_header Host $host;会把自己的域名video.XXXXX.com传给Cloudinary,而它只认res.cloudinary.com,自然找不到对应的资源。
修改后的核心配置
把你的location /块替换成下面的内容,同时可以删掉无用的root指令(因为你不需要本地文件服务):
server { listen 443 ssl; ssl on; server_name video.XXXXX.com; # 删掉root指令,因为不需要本地文件服务 ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; ssl_certificate /etc/nginx/ssl/XXXXX.crt; ssl_certificate_key /etc/nginx/ssl/XXXXX.key; ssl_session_cache shared:SSL:1m; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_verify_client off; location / { # 移除try_files,直接走反向代理 proxy_method GET; proxy_redirect off; # 关键:把Host头设置为Cloudinary的域名 proxy_set_header Host res.cloudinary.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port 443; # 下面这两个头重复了,保留一个即可 # proxy_set_header X-Forwarded-Ssl on; proxy_set_header X-Forwarded-HTTPS "on"; proxy_ssl_session_reuse off; proxy_http_version 1.1; proxy_pass http://video_balancer$request_uri; } }
额外优化建议
- 你可以把
upstream改成HTTPS,因为Cloudinary支持HTTPS,更安全:
然后把upstream video_balancer { server res.cloudinary.com:443; }proxy_pass改成https://video_balancer$request_uri;,同时添加proxy_ssl_server_name on;来确保SSL握手正常。 - 去掉重复的请求头(比如
X-Forwarded-Ssl和X-Forwarded-HTTPS留一个就行),减少不必要的请求开销。
修改完配置后,执行nginx -t检查配置语法是否正确,然后systemctl reload nginx重启服务,再访问你的示例链接应该就能正常加载资源了。
内容的提问来源于stack exchange,提问作者Mehdi Aghayari




