配置 Nginx 反向代理,当仅存在路径名时在传入的 http 请求上添加 index.html

配置 Nginx 反向代理,当仅存在路径名时在传入的 http 请求上添加 index.html

我需要将 nginx 设置为托管在 DO 空间(S3 类型对象存储)上的静态站点的反向代理。

他们的 s3 的问题是,如果我请求一个没有任何特定文件名的路径名,那么它不会将 index.html 作为默认值(这是我们所期望的)

如果我请求 s3.example.com/some/path/,它会给出错误,而不是在该文件夹中提供 index.html。DO 知道这个问题,但不会很快解决它。

我们陷入困境,因为我们花费了大量的时间和精力来迁移到 DO。我们所有的路径都是这种格式,因为我们是从其他设置迁移而来的。我们希望 s3.example.com/some/path/ 加载 s3.example.com/some/path/index.html - 这是正常的 Web 服务器行为。

nginx 可以作为反向代理吗?无论如何,我们都会在子域前面使用反向代理并执行 proxy_pass,即 example.com/some/path/ 将是 proxy_pass 到 s3.example.com/some/path/ - 这是使用普通的 proxy_pass

我想知道我们是否可以在执行 proxy_pass 时添加 index.html - 但仅限于没有任何文件名的请求。对于那些与某些文件名关联的请求,如 example.com/som/path/image.jpg 或其他 html 或其他文件,我们当然不想添加 index.html。

问题是,很多时候 URL 中没有以 / 结尾的 URL,例如 1 example.com/some/path 或 2 example.com/some/path/

在其他一些情况下,它将是 3 example.com/some/path/ex.html (或 jpg 或其他)

在第一种情况下,我们要添加 index.html 在第二种情况下,添加 /index.html 在第三种情况下,什么也不添加

在这种情况下配置会是什么样子?

先感谢您...

答案1

您可以重写每个以 结尾/或不包含.最后一个路径元素的 URI,然后再将其传递给上游服务器。

例如:

server {
    ...
    location / {
        ...
        rewrite ^(.*)/$ $1/index.html break;
        rewrite ^(.*/[^./]+)$ $1/index.html break;
        proxy_pass ...;
    }
}

这个文件了解详情。

相关内容