Apache中配置支持CORS(跨域資源共享)實例
當使用ajax跨域請求時,瀏覽器報錯:XmlHttpRequest error: Origin null is not allowed by Access-Control-Allow-Origin.肯定是跨域的問題,如果用jsonp或者proxy的方式進行修改的話未免需要太大的工程量,所以采用CORS這種比較簡單高效的技術。相比JOSP的方式,CORS更為高效。JSONP由於它的原理只能實現GET請求,而CORS支持所有類型的HTTP請求。使用CORS,可以使用普通的ajax實現跨域,這對於前端來說是極大的福音了,這個技術被現在大多數瀏覽器所普遍支持,因為跨域已經是普遍的要求,瀏覽器肯定會逐漸流出適當的‘后門'出來專門用以跨域。
瀏覽器支持情況
經本人測試IE瀏覽器中IE10及以上才可正常發送請求
1.服務器端對於CORS的支持,是通過設置Access-Control-Allow-Origin來進行的。如果瀏覽器檢測到相應的設置,就可以允許Ajax進行跨域的訪問,也就是相應的‘后門'。
設置Apache:Apache需要使用mod_headers模塊來激活HTTP頭的設置,它默認是激活的。你只需要修改Apache配置文件中的httpd.conf文件:
原始代碼
<Directory />
AllowOverride none
Require all denied
</Directory>
改為下面代碼
<Directory />
Require all denied
Header set Access-Control-Allow-Origin *
</Directory>
在處理請求的PHP文件中設置:
<?php
header("Access-Control-Allow-Origin:*");
//處理請求輸出數據
?>
配置的含義是允許任何域發起的請求都可以獲取當前服務器的數據。當然,這樣有很大的危險性,惡意站點可能通過XSS攻擊我們的服務器。所以我們應該盡量有針對性的對限制安全的來源,例如下面的設置使得只有http://jb51.net/這個域才能跨域訪問服務器的API。
httpd.conf中:
Header set Access-Control-Allow-Origin http://www.jb51.net
php文件中:
<?php
header("Access-Control-Allow-Origin:http://www.jb51.net");
前台代碼:
<script type="text/javascript">
function createCORSRequest(method, url) {
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr) {
// 此時即支持CORS的情況
// 檢查XMLHttpRequest對象是否有“withCredentials”屬性
// “withCredentials”僅存在於XMLHTTPRequest level 2對象里
} else {
// 否則檢查是否支持XDomainRequest
// XDomainRequest僅存在於IE中,是IE用於支持CORS請求的方式
xhr = new XDomainRequest();
}
xhr.open(method, url, true);
xhr.send();
xhr.onload = function(){
alert(xhr.responseText);
}
}
createCORSRequest('GET', "http://192.168.1.58/t.php");
</script>
Linux apache安裝加載mod_headers模塊
有服務器方面的問題無法解決?點擊這里尋求幫助。
今天為模塊安裝緩存插件WP Super Cache,需要用到apache的mod_headers模塊。下面介紹如何安裝加載mod_headers模塊。
1、進入httpd源碼包下的目錄modules/metadata。
- cd /lamp/httpd-2.2.20/modules/metadata
2、執行ls | grep mod_headers.命令,我們發現有
mod_headers.c
mod_headers.dep
mod_headers.dsp
mod_headers.exp
mod_headers.mak
這幾個文件,我們需要的是mod_headers.c。
3、執行安裝命令。
- /usr/local/apache/bin/apxs -i -a -c mod_headers.c
4、重啟httpd服務
- service httpd restart
下載apache(現在版本都是以這樣的方式表達的:httpd-*.*.*.tar.gz),去apache.org官網:http://apache.org/dist/httpd/
例如,下載的就是最新版本:httpd-2.2.9.tar.gz,放到你指定的目錄/usr/local/里面。Let's begin
- [root@local]# ls // 你會看到你下載的httpd-2.2.9.tar.gz.
- [root@local]# tar –zxvf httpd-2.2.9.tar.gz // 解壓后為httpd-2.2.9
- [root@local]# mkdir /usr/local/web/apache/ //在這個目錄下建立文檔,利於管理
- [root@local]# cd httpd-2.2.9
- [root@httpd-2.2.9]#./configure --prefix=/usr/local/web/apache //安裝路徑
- --enable-shared=max --enable-module=rewirte --enable-module=so
- [root@httpd-2.2.9]# make //編譯
- [root@httpd-2.2.9]# make install //安裝
- [root@httpd-2.2.9]# cd bin
- [root@bin]# apachectl start //開啟httpd服務
注解:
- ./configure //配置源代碼樹
- --prefix=/usr/local/apache2 //體系無關文件的頂級安裝目錄PREFIX ,也就Apache的安裝目錄。
- --enable-module=so //打開 so 模塊,so 模塊是用來提 DSO 支持的 apache 核心模塊
- --enable-mods-shared=all //編譯全部的模板,對於不需要我們可以在httpd.conf去掉。
- --enable-cache //支持緩存
- --enable-file-cache //支持文件緩存
- --enable-mem-cache //支持記憶緩存
- --enable-disk-cache //支持磁盤緩存
- --enable-static-support //支持靜態連接(默認為動態連接)
- --enable-static-htpasswd //使用靜態連接編譯 htpasswd - 管理用於基本認證的用戶文件
- --enable-static-htdigest //使用靜態連接編譯 htdigest - 管理用於摘要認證的用戶文件
- --enable-static-rotatelogs //使用靜態連接編譯 rotatelogs - 滾動 Apache 日志的管道日志程序
- --enable-static-logresolve //使用靜態連接編譯 logresolve - 解析 Apache 日志中的IP地址為主機名
- --enable-static-htdbm //使用靜態連接編譯 htdbm - 操作 DBM 密碼數據庫
- --enable-static-ab //使用靜態連接編譯 ab - Apache HTTP 服務器性能測試工具
- --enable-static-checkgid //使用靜態連接編譯 checkgid
- --disable-cgid //禁止用一個外部 CGI 守護進程執行CGI腳本
- --disable-cgi //禁止編譯 CGI 版本的 PHP
- --enable-ssl // 編譯 ssl模塊。