NGINX 中的 proxy_pass CDN 文件,但收到 502 错误请求

NGINX 中的 proxy_pass CDN 文件,但收到 502 错误请求

我正在使用 S3 存储 xml 文件并使用 CloudFront 分发此文件。我想使用 nginx proxy_pass 来定位此文件而不更改我的域名。例如 www.mydomain.com/filename.xml 该文件的 S3 url 是:https://s3-ap-southeast-2.amazonaws.com/bucketname/bucket-sub-name/filename.xml CDN 网址是https://dev.example.com/filename.xml 如果我像下面这样编写 nginx 配置,它可以正常工作。

if($request_uri = "/filename.xml") {
    rewrite .* /bucketname/bucket-sub-name$request_uri break;
    proxy_pass https://s3-ap-southeast-2.amazonaws.com;
}

但如果我像下面这样更改 nginx 配置,它会给我 502 bad gateway

if($request_uri = "/filename.xml"){
    proxy_pass https://dev.example.com$request_uri;
}

或者

if($request_uri = "/filename.xml"){
    proxy_pass https://s3-ap-southeast-2.amazonaws.com/bucketname/bucket-sub-name$request_uri;
}

有人能解释一下为什么第一部分可以工作,而第二部分和第三部分不工作吗?是因为 CDN 配置有问题吗?proxu_pass 直接传递 url 有没可能?

答案1

你需要

proxy_set_header Host "cdn domain" ;

将你的 nginx 请求主机从 nginx 重写为 cdn

答案2

if指令rewrite都是ngx_http_rewrite_模块模块和您获得的行为会根据它们周围的指令而有很大差异。最好尽可能避免这种if情况。对于您的情况,您可能可以使用嵌套locations...

您的第二部分和第三部分可能不起作用,因为它们指定了精确的 URL 而没有重写,并且这些 URL错了。当 URL 错误时,你可以在 Nginx 的 error_log 中验证,或者也可以使用 nginx 二进制文件的调试版本(nginx-debug)并切换错误日志Nginx 的 到debug

相关内容