Nginx服務器中處理AJAX跨域請求的配置方法講解


Nginx 實現AJAX跨域請求
AJAX從一個域請求另一個域會有跨域的問題。那么如何在nginx上實現ajax跨域請求呢?要在nginx上啟用跨域請求,需要添加add_header Access-Control*指令。如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
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等

如果需要允許來自任何域的訪問,可以這樣配置:

?
1
Access-Control-Allow-Origin: *

重啟nginx

?
1
service nginx reload

ajax跨域請求測試
成功時,響應頭是如下所示:

?
1
2
3
HTTP/1.1 200 OK
Server: nginx
Access-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的配置片段如下所示:

?
1
2
3
4
5
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下的配置如下所示:

?
1
2
3
4
5
6
7
8
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

         ProxyPass和ProxyPassReverse指令都是反向代理需要的配置。ProxyPass用於將一個遠程服務器映射到本地服務器的URL空間中。而ProxyPassReverse主要解決后端服務器重定向造成的繞過反向代理的問題,在后端服務器會進行服務器端跳轉時使用,對HTTP重定向時回應中的Location、Content-Location和URI頭里的URL進行調整。
         而在Linux下的配置如下所示:

?
1
2
3
4
5
6
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so
 
ProxyRequests Off
ProxyPassReverse /fb http://192.168.1.111/proxy/ # for server redirect


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM