我正在使用 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
。