我一直在努力让整个设置工作。我在网上找到了一些零碎的东西,但没有一个能解决我的所有要求。我需要这样做才能让 IE8 工作,所以不幸的是我有点束手无策。我可以移动一些端点,但可能不会移动太多。
我有一个位于 的用户 API https://api.foo.com/1.0/users
。该端点接受所有请求类型以及参数和动态段。以下是一些示例
- 得到 https://awesome.foo.com/1.0/users
- 得到 https://awesome.foo.com/1.0/users?a=b
- 得到 https://awesome.foo.com/1.0/users/1?a=b
- 邮政 https://awesome.foo.com/1.0/users
- 修补https://awesome.foo.com/1.0/users/1
我想配置 nginx 以接受来自另一个域和路径的请求并无缝地将它们转发到这些端点。例如
- 得到http://example.com/api/awesome/users->https://awesome.foo.com/1.0/users
- 得到http://example.com/api/awesome/users?a=b->https://awesome.foo.com/1.0/users?a=b
- 得到http://example.com/api/awesome/users/1?a=b->https://awesome.foo.com/1.0/users/1?1=b
- 邮政http://example.com/api/awesome/users->https://awesome.foo.com/1.0/users
- 修补http://example.com/api/awesome/users/1->https://awesome.foo.com/1.0/users/1
为了实现这一点,我需要转发请求参数以及表单数据。基本上整个请求需要完整转发然后返回。另请注意,我有几个不同的子域,所以这awesome
只是我想更改的几个名称之一。
图案是这样的
http://example.com/api/<subdomain>/<details> -> https://<subdomain>.foo.com/1.0/<details>
我最大的困难是保持完全相同,以及传递不同类型的请求。
我的努力 我尝试了很多方法,但最接近的可能是这个
location ~ ^/api/(.*)/(*.) {
resolver 8.8.8.8;
proxy_pass https://$1.foo.com/1.0/$2$is_args$args;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header X-Host $host;
}
**The `X-Host` directive doesn't work for me hence the comment
前两种情况适用,但第三种情况不适用。另外,我没有 POST 请求来处理这个问题。大多数情况下我都会502 Bad Gateway
出错。在我看来,它并没有完全映射,而是在收到第一个“/”时就中断了。添加另一个带有 3 个正则表达式参数的位置指令也没有帮助我。
我真的很感激任何关于这个问题的帮助,因为我完全不知道下一步该做什么。
答案1
您的正则表达式不正确,您应该使用location ~ ^/api/([^/]+)/(.*)$
,因为我不知道 PCRE 库如何选择 $1 作为子域,其内容很可能是awesome/users
而不是awesome
。