You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Nginx代理外部CDN媒体链接出现HTTP 404错误的解决方法

解决Nginx反向代理Cloudinary资源出现404的问题

我来帮你排查这个问题——你遇到的404其实是两个配置错误叠加导致的,咱们一步步来修正:

问题根源分析

  1. try_files指令阻断了反向代理:你当前的location /块里,try_files $uri $uri/ 404;会让Nginx先去本地root目录寻找对应文件,找不到就直接返回404,根本不会执行后面的proxy_pass逻辑。而你的需求是把所有请求都转发到Cloudinary,这个指令完全没必要,甚至起了反作用。
  2. 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-SslX-Forwarded-HTTPS留一个就行),减少不必要的请求开销。

修改完配置后,执行nginx -t检查配置语法是否正确,然后systemctl reload nginx重启服务,再访问你的示例链接应该就能正常加载资源了。

内容的提问来源于stack exchange,提问作者Mehdi Aghayari

火山引擎 最新活动