当前位置 主页 > 服务器问题 > nginx问题汇总 >

    Nginx服务器中处理AJAX跨域请求的配置方法讲解

    栏目:nginx问题汇总 时间:2018-11-08 16:11

    这篇文章主要介绍了Nginx服务器中处理AJAX跨域请求的配置方法讲解,包括Nginx作Apache的反向代理时的配置方法,需要的朋友可以参考下

    Nginx 实现AJAX跨域请求
    AJAX从一个域请求另一个域会有跨域的问题。那么如何在nginx上实现ajax跨域请求呢?要在nginx上启用跨域请求,需要添加add_header Access-Control*指令。如下所示:

    location /{add_header 'Access-Control-Allow-Origin' 'http://other.subdomain.com';add_header 'Access-Control-Allow-Credentials' 'true';add_header 'Access-Control-Allow-Methods' 'GET'; ......the rest of your configuration here...... }

    注释如下:

    第一条指令:授权从other.subdomain.com的请求 第二条指令:当该标志为真时,响应于该请求是否可以被暴露 第三天指令:指定请求的方法,可以是GET,POST等

    如果需要允许来自任何域的访问,可以这样配置:

    Access-Control-Allow-Origin: *

    重启nginx

    service nginx reload

    ajax跨域请求测试
    成功时,响应头是如下所示:

    HTTP/1.1 200 OKServer: nginxAccess-Control-Allow-Origin: other.subdomain.com


    用Nginx和Apache的反向代理解决Ajax的跨域问题

             傲游主站上有一个很吸引人的功能,就是下载次数计数,如下图所示。这个功能就是利用了上述技术实现的。

    2016113174307216.gif (268×67)

     从下图的Firebug中可以看到,该页面通过Ajax反复请求一个名为/api/counter的路径以径获取最新的下载数量。

    2016113174332406.gif (372×91)

    而这个输出路径实际上在服务器上是不存在的,这个路径只是另外一台服务器某个路径而已,这就是使用了Nginx的反向代理功能实现的。
          1、Nginx
             回到计数器的这个例子,Nginx的配置片段如下所示:

         location /api/counter {       rewrite (.*) /out break;        proxy_pass http://hfahe.maxthon.com;       proxy_set_header Host "hfahe.maxthon.com";     }

             那么访问http://www.maxthon.cn/api/counter这个地址,输出和直接访问http://hfahe.maxthon.com/out这个地址是完全一样的,如下图所示。通过这种方式,本地的Ajax就能够读取到其他远程服务器的数据了。

    2016113174351088.gif (350×62)

    proxy_set_header参数在需要进行域名的转发时使用。Nginx还可以进行端口的转发,只需将proxy_pas
    s配置修改为http://hfahe.maxthon.com:81这种形式即可。
             2、Apache
             Apache反向代理需要使用mod_proxy和mod_proxy_http.so等模块。
             在Windows下的配置如下所示:

         LoadModule proxy_module modules/mod_proxy.so     LoadModule proxy_http_module modules/mod_proxy_http.so      ProxyRequests Off     ProxyPass /start http://i.maxthon.cn/      ProxyPass /proxy http://192.168.1.111/proxy/     ProxyPassReverse /proxy http://192.168.1.111/proxy/ # for server redirect