我有一台 nginx 服务器,我想将以 开头的任何路由指向/app
特定文件。这是一个单页应用程序,因此/app/some/long/route
应该只返回相同的 index.html 文件。
location /app {
proxy_pass http://my-cdn-host.com/index.html;
}
我有两个问题:
- 我很确定这确实是一个不需要的
/app/very/long/url
proxy_passhttp://my-cdn-host.com/index.html/app/very/long/url
- 根据日志,我不清楚代理 URL 到底是什么,所以我甚至无法完全确认上述观点。
$proxy_host
而且$upstream_addr
我也没有完整的信息
最后一点:即使文件是http://my-cdn-host.com/index.html
,我也无法仅使用来访问它http://my-cdn-host.com/
。index.html
需要是明确的路径。
有没有办法为我的位置提供单个远程文件?谢谢
答案1
这正是proxy_pass
指令中描述的预期行为文档:
如果该
proxy_pass
指令以 URI 指定,则当请求传递到服务器时,与位置匹配的规范化请求 URI 的部分将被该指令中指定的 URI 替换:location /name/ { proxy_pass http://127.0.0.1/remote/; }
您需要使用另一个proxy_pass
行为特征,如下所述:
在某些情况下,无法确定要替换的请求 URI 的部分:
...
当使用指令在代理位置内更改 URI 时
rewrite
,相同的配置将用于处理请求(break
):location /name/ { rewrite /name/([^/]+) /users?name=$1 break; proxy_pass http://127.0.0.1; }
在这种情况下,指令中指定的 URI 将被忽略,并且完整更改的请求 URI 将传递给服务器。
使用以下位置块:
location /app {
rewrite ^ /index.html break;
proxy_pass http://my-cdn-host.com;
}