如何使用nginx作为跨域的反向代理

时间:2016-05-02 02:06:35

标签: nginx cross-domain reverse-proxy

我需要使用nginx实现以下测试用例:

www.example.com/api/应重定向到ABC.com/apiwww.example.com/api/site/login应重定向到XYZ.com/api/site/login

但是在浏览器中,用户只能看到www.example.com/api....(而不是重定向的网址)。

请告诉我如何实现这一目标。

2 个答案:

答案 0 :(得分:1)

stackoverflow rules禁止使用ABC.com,因此在示例配置中,我使用域名ABC.example.comXYZ.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的资源