我可以通过 proxy_pass 路由将 **/ 重定向或代理到 **/index.html 吗?

我可以通过 proxy_pass 路由将 **/ 重定向或代理到 **/index.html 吗?

我有以下域名指向我的 nginxmy.web.server

我想将请求代理到/cdn位于的文件主机file.host/myfiles

配置文件内容如下:

server {
    listen 80;
    server_name my.web.server;

    location ^~ /cdn {      
        proxy_pass https://file.host/myfiles;
    }
}

此配置成功代理了进入目标文件主机的所有请求,但是index.html如果输入/或路由,则不会重定向。

我想要实现的目标的一个例子如下:

my.web.server/cdn           => (proxy) file.host/myfiles/index.html
my.web.server/cdn/          => (proxy) file.host/myfiles/index.html
my.web.server/cdn/images    => (proxy) file.host/myfiles/images/index.html
my.web.server/cdn/images/   => (proxy) file.host/myfiles/images/index.html

my.web.server/cdn/**        => (proxy) file.host/myfiles/**/index.html
my.web.server/cdn/**/       => (proxy) file.host/myfiles/**/index.html

理想情况下,您不会在 url 中看到 index.html,它只会代理到该文件路径,但是如果这不可能的话,将用户重定向到那里也可以。


我一直在尝试类似的事情:

location ^~ /cdn {      
    proxy_pass https://file.host/myfiles;
    try_files $uri $uri/ $uri/index.html;
}

我希望通过这个实现的是告诉 nginx“在这里代理”,尝试查看是否存在文件,如果没有出现任何内容,则尝试index.html在该路由中查找。

答案1

来自代理密码文档:

如果使用 URI 指定了 proxy_pass 指令,则在将请求传递到服务器时,与位置匹配的规范化请求 URI 的部分将被指令中指定的 URI 替换

因此:

  1. 您请求的 URI 正在规范化
  2. 与您的位置相匹配的规范化对应部分/cdn被替换为/myfiles

请记住,规范化会删除目录遍历等伪像,因此请求/cdn/**很可能会导致规范化的路径/

如果你想避免规范化,你必须干扰正常匹配。你可以尝试(未经测试):

location ^~ /cdn {
    rewrite    /cdn(.*) $1 break;
    proxy_pass https://file.host/myfiles;
}

相关内容