1. 程式人生 > >多域名環境,頁面獲取url的一種方案

多域名環境,頁面獲取url的一種方案

loadurl -i 頁面獲取url html 變量 ice content 一個 信息

因為系統是分布式部署的。而且有多個域名,所以常常涉及到獲取url的問題。

這是系統框架層面須要提供的能力。否則每一個模塊都須要自己去想辦法獲取ip,就會非常混亂。上線也easy發生bug

主要須要解決幾個問題:

1、可以自己主動區分開發環境和生產環境。比方部署上線。url可能是http://www.xxx.com/svc/hello,而在本地開發的時候應該是http://127.0.0.1/svc/hello。而不能寫死,否則開發和部署就要換來換去。非常麻煩

2、可以依據不同的服務。區分URL。比方獲取驗證碼的服務。應該調用http://www.xxx.com/svc/getCode。而微信相關的服務,應該調用http://wx.xxx.com/svc/xxx

本文總結分享一下思路:

配置文件

1、應用有相應的配置文件,裏面說明了是以開發模式,還是以生產模式啟動。而且將URL分離開,比方鑒權相關的URL,微信相關的URL,普通服務相關的URL等

2、同一時候,配置文件有多份,比方topo-dev.json。topo-production.json,topo-image.json等。這樣就把不同的環境隔離開,假設是以開發模式啟動,載入的就是topo-dev.json,當中配置的URL都是127.0.0.1這種

3、啟動的時候,載入此配置文件,並將關鍵信息放在global._g_env全局變量以下。執行時就能非常方便地獲取到環境和URL信息了

服務端獲取URL

服務端的代碼也是跑在node環境下。所以要獲取URL就非常easy,通過_g_env.url,就能夠拿到配置文件中的路徑了

前端頁面獲取URL

前端頁面常常也須要發送ajax請求。所以也須要知道url。可是靜態的js沒有辦法獲取server的環境信息和URL等。所以須要從服務端獲取到這些信息,一種可行的做法是:

首先服務端有一個服務,專門將這些信息下發:

function clientSettingScript(req, res, next){

    var script = "window.global = {_g_server:{}}; \n"+
        ";global[\"_g_server\"].staticurl=\"" +global["_g_topo"].clientAccess.staticurl + "\"\n"+
        ";global[\"_g_server\"].uploadurl=\"" +global["_g_topo"].clientAccess.uploadurl + "\"\n"+
        ";global[\"_g_server\"].authurl=\"" +global["_g_topo"].clientAccess.authurl + "\"\n"+
        ";global[\"_g_server\"].serviceurl=\"" +global["_g_topo"].clientAccess.serviceurl + "\"\n"+
        ";global[\"_g_server\"].wxserviceurl=\"" +global["_g_topo"].clientAccess.wxserviceurl + "\"\n"+
        ";global[\"_g_server\"].nail_pc_url=\"" +global["_g_topo"].connector.nail_pc_url + "\"\n"+
        ";global[\"_g_env\"] =\"" +global["_g_topo"].env+ "\";\n";
    res.end(script);

}

這是一個express的普通服務,可是事實上是一段js腳本。在前端頁面,用script標簽來載入它

<script src="/svc/portal/setting"></script>

這樣當瀏覽器拿到響應之後,就會將它作為一段js腳本來運行。在window上放了一個全局變量global,當中有環境信息和URL信息

同一時候,URL僅僅包括域名,頁面依據實際情況,組裝完整的URL,比方:

security_code_url: global["_g_server"].serviceurl +  "/getCode/"

總結

這樣的做法的關鍵在於:

1、把URL和環境信息放到單獨的配置文件裏,而不是寫死在代碼裏。同一時候依據開發環境、生產環境、鏡像環境隔離不同的配置文件

2、server端專門寫一個服務,把這些配置信息給到client頁面,client頁面也不用寫死了

多域名環境,頁面獲取url的一種方案