我需要使用 nginx 实现以下测试用例:
www.example.com/api/
应重定向到ABC.com/api
,而www.example.com/api/site/login
应该重定向到XYZ.com/api/site/login
但在浏览器中,用户应该只看到www.example.com/api....
(而不是重定向的 URL(。
请让我知道如何实现这一点。
> 堆栈溢出规则禁止使用 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;
}
...
}
(如果需要,将 http://替换为 https://(
location
指令的顺序并不重要,因为正如文档所述,选择了具有最长匹配前缀的位置。
使用 proxy_set_header
参数,nginx 将完全按照您需要的方式运行,用户将看到 www.example.com/api...否则,如果没有此参数,nginx 将生成 HTTP 301 重定向到 ABC.example.com 或 XYZ.example.com。
在 proxy_pass
参数中指定 URI,因为如文档所述,如果在没有 URI 的情况下指定proxy_pass,则请求 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;
...
}
试试这个:
location /api {
proxy_pass http://proxiedsite.com/api;
}
当NGINX代理请求时,它会将请求发送到指定的 代理服务器,获取响应,并将其发送回客户端。 可以将请求代理到HTTP服务器(另一个NGINX 服务器或任何其他服务器(或非 HTTP 服务器(可以运行 使用特定框架开发的应用程序,例如 PHP 或 Python(使用指定的协议。支持的协议包括 FastCGI、uwsgi、SCGI 和 memcached。
要将请求传递给 HTTP 代理服务器,proxy_pass 指令 在位置内指定。
来自NGINX Docs的资源