国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

筆記:如何獲取網(wǎng)站根域名

MasonEast / 2937人閱讀

摘要:首先聲明,這里所說的根域名,并不是指全球共有臺根邏輯域名服務(wù)器這句話中的根域名。在本文中,我們將這樣的域名稱為根域名。無論訪問哪個子站點,都要通過將存放到根域名下。在這種情況下,顯然我們不能認為是根域名。比如一個名為的倉庫。

首先聲明,這里所說的“根域名”,并不是指“全球共有13臺根邏輯域名服務(wù)器”這句話中的“根域名”。而是指某一個站點的“根域名”。

百度搜索是“www.baidu.com”,百度翻譯的域名是“fanyi.baidu.com”,百度地圖的域名則是“map.baidu.com”。這些域名有共同的部分“baidu.com”。在本文中,我們將“baidu.com”這樣的域名稱為“根域名”。前端同學(xué)應(yīng)該都知道,在“.baidu.com”這一域下的 cookie 可以在其他子站點下拿到(當(dāng)然,前提是端口號和協(xié)議都保持一致)。

最近開發(fā)的過程中遇上了一個小問題。無論訪問哪個子站點,都要通過 js 將 cookie 存放到根域名下。

一開始比較大意,直接拿正則匹配。問題是忽略了這世界上還存在“www.xxx.edu.cn”這樣的站點。在這種情況下,顯然我們不能認為”edu.cn“是根域名。想在一個叫“edu.cn”的域下存 cookie?對不起,瀏覽器做不到。(這句話很重要。)

正則匹配是做不到了。搜索了一下,網(wǎng)上也沒有什么特別好的解決方案。無非是枚舉出國內(nèi)常見的一些頂級域名,然后再進行處理,如下面這個 PHP 的例子:

但如何確保我們枚舉出的例子一定是完全的無遺漏的呢?不完美,放棄。

PSL

接著上 github 上去找例子。倒是發(fā)現(xiàn)了一些解決域名的工具。比如一個名為 psl 的倉庫。

PSL 是 “Public Suffix List” 的縮寫,這個“公共域名后綴列表”項目本來是供瀏覽器廠商使用的。可以訪問官網(wǎng),另外建議看看這篇《域名小知識:Public Suffix List》。

我搜索到的這個 psl 倉庫正是基于 PSL、使用 js 來解析域名的。粗略看了下,存放域名的 json 文件有 108 KB。嚇死了。

另一款叫做 parse-domain 的,光是生成的正則表達式文件就有 203 KB。

沒辦法,一個跑到瀏覽器上的前端腳本,本身不到 1500 行,為了一個判斷引入上百 KB 的外部依賴,實在不劃算。

于是只能自己另起爐灶,想想別的辦法。

document.domain

首先想到的是 document.domain。在一些需要跨域的場景中,可能會見到這貨的身影。比如這篇文章 所描述的,“相同主域名不同子域名下的頁面,可以設(shè)置 document.domain 讓它們同域”。

經(jīng)過測試發(fā)現(xiàn),對于域名c.example.edu.cn下的頁面,可以執(zhí)行下面這句:

document.domain = "example.edu.cn";

而在 Chrome 下,下面這句則無法執(zhí)行:

// DOMException
document.domain = "edu.cn";

瀏覽器會拋出DOMException

1 Uncaught DOMException: Failed to set the "domain" property on "Document": "edu.cn" is not a suffix of "c.example.edu.cn".

IE 也會報出“參數(shù)無效”的錯誤;Firefox 下同樣會拋出錯誤:

NS_ERROR_DOM_BAD_DOCUMENT_DOMAIN: Illegal document.domain value

從報錯信息可以看到, DOMException 是可以捕獲到的。那就好辦了。

將域名(或頁面當(dāng)前的 document.domain) split 成數(shù)據(jù) ["x", "example", "edu", "cn"],從右向左逐次加上一個元素,每次將單詞使用句點連接并賦值給 document.domain。如果 catch 到錯誤,則進行下一次操作。一旦賦值成功,即可 break 循環(huán)。

上代碼:

const domain = document.domain;
const list = domain.split(".");

let len = list.length;
let rootDomain = domain;

while (len--) {
  try {
    document.domain = list.slice(len).join(".");
    rootDomain = document.domain;
    break;
  } catch (e) {}
}

// 還得恢復(fù)原值,避免產(chǎn)生副作用
document.domain = domain;

console.log(rootDomain);

很好,經(jīng)過簡單測試,Chrome、IE 妥妥的。

然而 Firefox 掛了。掛在最后的還原階段。也就是說,F(xiàn)irefox 允許修改 document.domain,但不允許修改成上一級之后,再回退到下一級。

此外(感謝老大),在 Safari 上測試發(fā)現(xiàn),document.domain = "cn" 不會報錯!什么鬼?請移步《Webkit下最無敵的跨大域方案》。

功虧一簣。心好累啊。

Cookie 救火

最后想起前面提到的一句,“想在一個叫 edu.cn 的域下存 cookie?對不起,瀏覽器做不到。”

要不咱試試 cookie?動手!

道理同上,每次嘗試在手動拼接的 domain 下面存 cookie,然后檢查 cookie 是否保存成功。一旦成功,則 break 循環(huán),并清除該 cookie。沒有副作用,只是多操作幾次 cookie。

換個思路,總算是解決了。

代碼被我放在了 Github 上。順手貼在這里:

var KEY = "__rT_dM__" + (+new Date());
var R = new RegExp("(^|;)s*" + KEY + "=1");
var Y1970 = (new Date(0)).toUTCString();

module.exports = function getRootDomain() {
  var domain = document.domain || location.hostname;
  var list = domain.split(".");
  var len = list.length;
  var temp = "";
  var temp2 = "";

  while (len--) {
    temp = list.slice(len).join(".");
    temp2 = KEY + "=1;domain=." + temp;

    // try to set cookie
    document.cookie = temp2;
  
    if (R.test(document.cookie)) {
      // clear
      document.cookie = temp2 + ";expires=" + Y1970;
      return temp;
    }
  }
};

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/82707.html

相關(guān)文章

  • 01 【零基礎(chǔ)入門】html學(xué)習(xí)筆記(2)

    摘要:,表單的兩個常見屬性為填寫表單的人提供一個輸入提示。可用于任何表單控件,表示這個域是必要的,如果不填,則無法提交表單。,表格,表格由行中的數(shù)據(jù)單元格組成,列隱含地定義在行中。,表格應(yīng)用于表示表格數(shù)據(jù),而不是建立頁面布局。 1,如何設(shè)計一個頁面 1) 先規(guī)劃好web頁面的結(jié)構(gòu),首先畫出一個草圖,然后創(chuàng)建一個略圖,最后再寫html2) 規(guī)劃頁面時,先設(shè)計大的塊元素,再用內(nèi)聯(lián)元素...

    kamushin233 評論0 收藏0
  • HTTP筆記

    摘要:主要內(nèi)容協(xié)議概述狀態(tài)碼報頭協(xié)議協(xié)議是互聯(lián)網(wǎng)使用最多的協(xié)議,是客戶端和服務(wù)器請求應(yīng)答的標準,端口是。一般用于與請求永久移動。今后任何新的請求都應(yīng)使用新的代替未修改。 主要內(nèi)容 協(xié)議概述 狀態(tài)碼 報頭 http協(xié)議 http協(xié)議是互聯(lián)網(wǎng)使用最多的協(xié)議,是客戶端和服務(wù)器請求應(yīng)答的標準TCP,端口是80。用戶通過http和url統(tǒng)一資源定位符獲取網(wǎng)頁代碼供瀏覽器渲染。簡單快速,無連接無狀態(tài)...

    maybe_009 評論0 收藏0
  • 如何對GitHubPages上的靜態(tài)資源進行CDN加速

    摘要:幸運的是,采用任播技術(shù)架設(shè)鏡像服務(wù)器可解決該問題,并使得實際運行的根域名服務(wù)器數(shù)量大大增加。截至年月,全球共有臺根域名服務(wù)器在運行。 前記 從我開始學(xué)習(xí)前端我就一直在做著我的個人簡歷網(wǎng)站,使用GitHubpPages的預(yù)覽功能進行預(yù)覽,但是由于最近我的個人簡歷,不停的豐富,圖片增多,而且將css和js文件用webpack打包后變成一個很大的問價,網(wǎng)頁的加載速度就變的像龜速一樣,所以我決...

    SHERlocked93 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<