服務端(apache)解決Javascript跨域問題
由於前端解決跨域問題的局限性比較大,對於 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.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so
2 在 server config 或 virtual host 中增加:
<Location /folder>
SetHandler proxy-server
order allow,deny
Allow from all
</Location>
RewriteEngine on
RewriteRule ^/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’沒有區別。