最近收到一個需求,要求我們開發的一套系統然后這套系統中可以實現多個域名指向這套系統,但是每個域名打開的內容還要顯示對應域名的內容,網上找了幾天發現只有一個叫“域名轉發”的功能(具體不做介紹,百度有很多),“域名轉發”只有頂級域名才能使用,感覺還不如直接頁面跳轉,而我們的需求是打開后點擊內容頁后域名還不能變,這時候我就考慮能不能通過程序來實現這個需求,通過我的構思是可以實現的
本人的運行環境是:php+apache+mysql,框架用的是thinkphp3.2,如果是其他語言或其他框架那就可以看下我的實現思路,其他的語言實現也並不難
我們程序的場景:在我們程序中有多個地區,每個地區都有不一樣的內容,但是頁面是一樣的,主域名訪問下就是顯示默認主地區的內容,其他域名訪問則是要顯示對應的分區內容
首先所有的域名是指向同一套系統的,所以這給了我很大的操作空間,因為最麻煩的就是怎樣判斷是要顯示什么內容,當時我也是突然靈光一閃突然想到了什么,然后順這往下想,然后就抓住了“域名指向同一套系統”這句話,隨后我就想到了可以通過程序來獲取來訪域名,順着這思路往下想,能獲取到來訪域名那我在數據庫中設置所有域名要顯示的東西,那需求不就解決了嗎
上面是實現思路,下面是實現過程
php獲取域名有內置方法:$_SERVER['SERVER_NAME']
獲取到來訪域名后,然后就是匹配我在配置文件中的內置域名(主域名),如果是一樣的那就顯示默認內容
如果域名不一致就先匹配數據庫中存的對應地區的域名讀取出地區id,然后就更新配置文件中的內置地區id
實現代碼:
//判斷輸入的域名是否和配置域名一致 C('PROGRAM_DOMAIN_NAME_NOT_HTTP')配置文件中的域名
if(C('PROGRAM_DOMAIN_NAME_NOT_HTTP') == $_SERVER['SERVER_NAME'])
{
return;//因為我是把方法封裝了,所以就直接返回為空就好了
}
//查詢出對應的id
$data = M('area')->where('INSTR(url,'.$_SERVER['SERVER_NAME'].')')->getField('id');
//更新對應的配置,對這種關系的方法做個解釋,只會更新這次,這點需要注意
C('AREAID', $data );
實現思路說起來很長,但是最核心的代碼就那么兩句,其他要實現的內容就可以在這個基礎上擴展