我需要使用nginx实现以下测试用例:
www.example.com/api/
应重定向到ABC.com/api
,
www.example.com/api/site/login
应重定向到XYZ.com/api/site/login
但是在浏览器中,用户只能看到www.example.com/api....
(而不是重定向的网址)。
请告诉我如何实现这一目标。
答案 0 :(得分:1)
stackoverflow rules禁止使用ABC.com,因此在示例配置中,我使用域名ABC.example.com
和XYZ.example.com
:
server {
...
server_name www.example.com;
...
location /api/ {
proxy_set_header Host ABC.example.com;
proxy_pass http://ABC.example.com;
}
location /api/site/login {
proxy_set_header Host XYZ.example.com;
proxy_pass http://XYZ.example.com;
}
...
}
(如果需要,请用https://替换http://)
location
指令的顺序并不重要,因为作为文档states,选择了最长匹配前缀的位置。
使用proxy_set_header
参数,nginx会完全按照您需要的方式运行,并且用户将看到www.example.com/api ...否则,如果没有此参数,nginx将生成HTTP 301重定向到ABC.example.com或XYZ.example.com。
您不需要在proxy_pass
参数中指定URI,因为作为文档states,如果指定了proxy_pass而没有URI,则请求URI将以相同的方式传递到服务器。客户处理原始请求时发送的表单。
您可以将服务器ABC.example.com和XYZ.example.com指定为域名或IP地址。如果将它们指定为域名,则需要在服务器配置中指定其他参数resolver
。您可以使用本地名称服务器(如果有的话),也可以使用外部名称(如Google公共DNS(8.8.8.8)或ISP为您提供的DNS):
server {
...
server_name www.example.com;
resolver 8.8.8.8;
...
}
答案 1 :(得分:0)
试试这个:
location /api {
proxy_pass http://proxiedsite.com/api;
}
当NGINX代理请求时,它会将请求发送到指定的请求 代理服务器,获取响应,并将其发送回客户端。 可以将请求代理到HTTP服务器(另一个NGINX 服务器或任何其他服务器)或非HTTP服务器(可以运行 使用特定框架开发的应用程序,例如PHP或 Python)使用指定的协议。支持的协议包括 FastCGI,uwsgi,SCGI和memcached。
将请求传递给HTTP代理服务器,即proxy_pass指令 在一个位置内指定。
来自NGINX Docs的资源