使用 nginx 重写 URL,使其提供 index.html

使用 nginx 重写 URL,使其提供 index.html

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

相关内容