由於前端解決跨域問題的局限性比較大,對於 Ajax 跨域或是 iframe 跨域,建議用伺服器端解決方案。
此方案的原理是接受用戶端發來的請求後,經由本網域服務器代理向目標伺服器發送請求,並將響應資料返回給用戶端。
用 apache 的 mod_proxy 模組開啟反向 Proxy功能來實現:
1 修改 apache 設定檔 httpd.conf ,去掉以下兩行前面 # 號
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
2 在 server config 或 virtual host 中增加:
ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass /folder http://****.com/floder
重啟 apache.
注釋: ProxyRequests Off 指令是指採用反向(reverse)代理,對於用戶端而言它就像是原始伺服器,並且用戶端不需要進行任何特別的設定;而正向 Proxy允許用戶端通過它訪問任意網站並且隱藏用戶端自身,因此必須採取安全措施以確保僅為經過授權的用戶端提供服務。 ProxyPass 指令允許將一個遠端伺服器映射到本機伺服器的 URL 空間中,此時本機伺服器並不充當代理角色,而是充當遠程伺服器的一個鏡像。/folder 是一個本地虛擬路徑,http://****.com/floder 是一個指向遠程伺服器的部分 URL
如果不想對某個子目錄進行反向 Proxy時,可以用"!"指令。比如說:
ProxyPass /folder/exception ! ProxyPass /folder http://****.com/floder
將會代理除 /folder/exception 之外的所有對 http://****.com/floder 的請求。
也可以用 URL 重寫的方法來實現
1 修改 apache 設定檔 httpd.conf ,去掉以下三行前面 # 號
LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_http_module modules/mod_proxy_http.soLoadModule rewrite_module modules/mod_rewrite.so
2 在 server config 或 virtual host 中增加:
<Location /folder> SetHandler proxy-server order allow,deny Allow from all</Location>RewriteEngine onRewriteRule ^/folder/(.*)$ http://****.com/floder [L,R=301,P,NC]
注釋: Location 指令提供了基於URL的存取控制,對於本域下的 /folder 目錄下的任何資源的訪問都會首先由proxy-server這個 handler(mod_proxy模組內部定義的一個 handler)來處理。 SetHandler proxy-server 指令是強制所有匹配的檔案被一個Proxy 伺服器處理。 RewriteEngine on 指令是指開啟重寫引擎。 RewriteRule 指令是重寫規則。 last|L 這個標記用於阻止當前已被重寫的 URL 被後繼規則再次重寫。 redirect|R [=code] 若Substitution以http://thishost[:thisport]/(使新的URL成為一個URI)開頭,可以強制性執行一個外部重新導向,是跨域或定向到外部域的必備良藥。預設為 HTTP 響應碼為 302, 我通常指定為301。 proxy|P 此標記使替換成分被內部地強製作為代理請求發送,表明該 rewrite 是通過 mod_proxy 代理過去,而不是通過外部重新導向過去。 nocase|NC 忽略大小寫,也就是在Pattern與當前 URL 匹配時,’A-Z’和’a-z’沒有區別。