我正在使用 S3 来托管一些静态内容,并使用一些 URL 重写来使一切正常工作。
这是我现在的会议:
server {
listen 80; ## listen for ipv4
listen [::]:80 default ipv6only=on; ## listen for ipv6
server_name "~^(.+)\.bar\.com$";
access_log /var/log/nginx/foobar-star.access.log;
set $subdomain $1;
rewrite ^(.*)$ /$subdomain$request_uri?;
location / {
proxy_pass http://foo.bar.com.s3.amazonaws.com;
}
}
我的问题是,如果请求是 baz.bar.com,我希望我的 url 是 foo.bar.com.s3.amazonaws.com/baz/index.html,如果是 baz.bar.com/css/whatever.css,我希望是一般情况 foo.bar.com.s3.amazonaws.com/baz/css/whatever.css,我已经在配置中涵盖了这一点。我不能使用 $request_filename,因为 S3 总是提供一些东西,甚至告诉你你请求的密钥不存在,所以我需要一个通用规则来附加到我的 url index.html 以防它不存在。我相信这就是正常索引指令不起作用的原因……
简而言之:如果我尝试访问 baz.bar.com/index.html,一切都会顺利进行;如果我尝试访问 baz.bar.com/,它会(正确地)返回一个文档,告诉我键“baz”不存在。我希望 baz.bar.com/ 直接呈现我的 index.html,其他一切都保持不变。
希望我已经说清楚了——我知道这有点令人困惑:)
短暂性脑缺血发作
答案1
为了在代理之前自动将 index.html 添加到以 / 结尾的每个请求,我认为您需要类似以下内容:
server {
listen 80; ## listen for ipv4
listen [::]:80 default ipv6only=on; ## listen for ipv6
server_name "~^(.+)\.bar\.com$";
access_log /var/log/nginx/foobar-star.access.log;
set $subdomain $1;
location / {
# if the request ends with /, add index.html
# the break will stop nginx from looping
rewrite /$ "/$subdomain${uri}index.html" break;
# else, just prefix $subdomain
rewrite ^ /$subdomain$request_uri? break;
proxy_pass http://foo.bar.com.s3.amazonaws.com;
}
}
答案2
当无法找到密钥时,S3 返回什么 HTTP 错误代码?您可以使用错误代码来提供自定义错误页面,该页面将是索引页面。
S3 错误代码列表 http://docs.amazonwebservices.com/AmazonS3/latest/API/
配置自定义错误页面的链接 http://articles.slicehost.com/2008/5/16/ubuntu-hardy-nginx-virtual-host-settings