我正在尝试做我认为世界上最简单的代理指令,代理一个公共 S3 存储桶。
这是我的配置:
server {
listen 80;
listen [::]:80;
server_name experiment.local;
location /404.html {
proxy_pass https://minio/bucket/404.html;
}
location / {
error_page 404 = /404.html;
proxy_pass https://minio/bucket/;
}
}
当获取存储桶中不存在的页面时实际发生了什么我从 nginx 获得如下信息:
<Error>
<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>
<Key>index.html1</Key>
<BucketName>visar</BucketName>
<Resource>/bucket/index.html1</Resource>
<RequestId>SCRUBBED</RequestId>
<HostId>SCRUBBED</HostId>
</Error>
我尝试过各种各样的方法,但总是得到类似的结果。nginx 正在正确转发 HTTP 返回代码,所以我得到了 404(最初我使用单行 proxy_pass 得到了 200)。
我知道我做了一些非常基本、非常错误的事情,但我就是说不出来到底是什么。
答案1
server {
listen 80;
listen [::]:80;
server_name experiment.local;
location /404.html {
proxy_pass https://minio/bucket/404.html;
}
location / {
proxy_pass https://minio/bucket/;
proxy_intercept_errors on;
error_page 404 = /404.html;
}
}
显然,订购有些重要。
答案2
我遇到了类似的问题。对于我来说,解决方法是删除 proxy_pass 行上的尾部斜杠 ( / )。
改变
proxy_pass https://minio/bucket/;
到
proxy_pass https://minio/bucket;
我相信这是因为与您的位置块匹配的请求 URL 包含斜线 ( / )。因此您正在代理 https://minio/bucket//something,这将在 S3 端失败。