笔记:如何获取网站根域名

news/2024/4/27 9:11:55/文章来源:https://blog.csdn.net/weixin_34137799/article/details/89051168

首先声明,这里所说的“根域名”,并不是指“全球共有13台根逻辑域名服务器”这句话中的“根域名”。而是指某一个站点的“根域名”。

百度搜索是“www.baidu.com”,百度翻译的域名是“fanyi.baidu.com”,百度地图的域名则是“map.baidu.com”。这些域名有共同的部分“baidu.com”。在本文中,我们将“baidu.com”这样的域名称为“根域名”。前端同学应该都知道,在“.baidu.com”这一域下的 cookie 可以在其他子站点下拿到(当然,前提是端口号和协议都保持一致)。

最近开发的过程中遇上了一个小问题。无论访问哪个子站点,都要通过 js 将 cookie 存放到根域名下。

一开始比较大意,直接拿正则匹配。问题是忽略了这世界上还存在“www.xxx.edu.cn”这样的站点。在这种情况下,显然我们不能认为”edu.cn“是根域名。想在一个叫“edu.cn”的域下存 cookie?对不起,浏览器做不到。(这句话很重要。)

正则匹配是做不到了。搜索了一下,网上也没有什么特别好的解决方案。无非是枚举出国内常见的一些顶级域名,然后再进行处理,如下面这个 PHP 的例子:

但如何确保我们枚举出的例子一定是完全的无遗漏的呢?不完美,放弃。

PSL

接着上 github 上去找例子。倒是发现了一些解决域名的工具。比如一个名为 psl 的仓库。

PSL 是 “Public Suffix List” 的缩写,这个“公共域名后缀列表”项目本来是供浏览器厂商使用的。可以访问官网,另外建议看看这篇《域名小知识:Public Suffix List》。

我搜索到的这个 psl 仓库正是基于 PSL、使用 js 来解析域名的。粗略看了下,存放域名的 json 文件有 108 KB。吓死了。

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

没办法,一个跑到浏览器上的前端脚本,本身不到 1500 行,为了一个判断引入上百 KB 的外部依赖,实在不划算。

于是只能自己另起炉灶,想想别的办法。

document.domain

首先想到的是 document.domain。在一些需要跨域的场景中,可能会见到这货的身影。比如这篇文章 所描述的,“相同主域名不同子域名下的页面,可以设置 document.domain 让它们同域”。

经过测试发现,对于域名c.example.edu.cn下的页面,可以执行下面这句:

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

而在 Chrome 下,下面这句则无法执行:

// 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 也会报出“参数无效”的错误;Firefox 下同样会抛出错误:

NS_ERROR_DOM_BAD_DOCUMENT_DOMAIN: Illegal document.domain value

从报错信息可以看到, DOMException 是可以捕获到的。那就好办了。

将域名(或页面当前的 document.domain) split 成数据 ['x', 'example', 'edu', 'cn'],从右向左逐次加上一个元素,每次将单词使用句点连接并赋值给 document.domain。如果 catch 到错误,则进行下一次操作。一旦赋值成功,即可 break 循环。

上代码:

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) {}
}// 还得恢复原值,避免产生副作用
document.domain = domain;console.log(rootDomain);

很好,经过简单测试,Chrome、IE 妥妥的。

然而 Firefox 挂了。挂在最后的还原阶段。也就是说,Firefox 允许修改 document.domain,但不允许修改成上一级之后,再回退到下一级。

此外(感谢老大),在 Safari 上测试发现,document.domain = 'cn' 不会报错!什么鬼?请移步《Webkit下最无敌的跨大域方案》。

功亏一篑。心好累啊。

Cookie 救火

最后想起前面提到的一句,“想在一个叫 edu.cn 的域下存 cookie?对不起,浏览器做不到。”

要不咱试试 cookie?动手!

道理同上,每次尝试在手动拼接的 domain 下面存 cookie,然后检查 cookie 是否保存成功。一旦成功,则 break 循环,并清除该 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 cookiedocument.cookie = temp2;if (R.test(document.cookie)) {// cleardocument.cookie = temp2 + ';expires=' + Y1970;return temp;}}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_783620.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机输入输出接口形式,输入输出接口-微计算机原理-电子发烧友网站

第五节 输入输出接口如第六章所述,CPU要通过接口电路才能和外设交换信息.一般在接口电路中要有输入输出数据锁存器和 缓冲器,要有状态和控制命令寄存器,还要有地址译码器和控制电路,以及中断控制逻辑电路.这样才能解决 CPU与外设时序匹配问题,对外设实施控制,保证CPU于外设正确…

era5数据内容说明_关于爬取网站数据保存为docx出现的一些问题

最近同事在爬取某网站数据,想将爬取的数据保存为docx。在爬取数据过程中一切很顺利,但是在保存数据时却提示以下错误。File "srclxmletree.pyx", line 1024, in lxml.etree._Element.text.__set__ File "srclxmlapihelpers.pxi", l…

搭载网站的云服务器需要空间备案,云服务器需要备案么

如果国内用户使用国内大陆免备案云服务器的好处在于,不必受限于网站的备案流程,购买之后,建好网站就可以迅速使用。如果是大陆的主机,还要进行备案的提交,审核等流程。用户们在选择免备案免备案服务器一般以总之&#…

如何将你的网站开发成手机应用?

2019独角兽企业重金招聘Python工程师标准>>> 只需2步: 一、建立网页手机版 一般企业都有PC版本的web页面,有些也有手机版的wap页面,如果有手机版的wap页面那就更好了,做成应用入口,用户的体验会好很多。如果…

刨根问底--技术--jsoup登陆网站

2019独角兽企业重金招聘Python工程师标准>>> 使用jsoup登陆网站,重要的就是看这个网站登录的时候需要什么信息? 步骤: (1) Jsoup.connect(url)创建一个connect对象,注意:这个方法只…

《高性能网站建设指南》阅读体会

今日阅读了《高性能网站建设指南》一书,该书的作者Steve Souders"为Yahoo!的开发团队构建了YSlow"。YSlow是Web页面性能分析工具,可以集成至Firebug,非常好用。书和工具是配套的,工具会在线更新,书印出来就不…

源码下载和购买网站

1.速帮网 http://www.58subang.com/ 2. 免费源码下载站 搜刮好东西 http://www.sogua2008.com/ 3.码云-开源中国代码托管平台 提供开源代码 https://gitee.com/ 4.看源社区 http://www.see-source.com/ 转载于:https://www.cnblogs.com/yangchunlong/p/8195957.html

初中计算机使用在线,初中信息技术考试模拟试题(flash+网站基础知识)

教学设计、复习1flash&网站总分60分 考试时间30分钟题号 一 二 总分 分数得分 评卷人一、单项选择题(共20题,计20分)第1题(1分): 制作个人网站时为了使网页界面整齐、有序,一般使用哪种工具对网页布局() A 、格式刷 B 、表格 C 、标尺 D 、文本框第2…

[置顶] 第一个ASP.NET网站——从静态到动态

【操作步骤】 一、创建简单的静态网页 1、在D盘新建文件夹aaa; 2、在文件夹aaa中新建文本档&#xff0c;输入如下内容&#xff1a; <html> <head> <title>简单的静态网站</title> </head> <body> 你好&#xff0c;今天是2013年4月28日。 &…

黑客对俄罗斯克里姆林宫网站展开攻击

俄罗斯政府周一表示&#xff0c;上周日&#xff0c;黑客对克里姆林宫网站进行“非常严重的”攻击。克里姆林宫发言人迪米特里佩斯科夫(Dmitry Peskov)表示&#xff0c;这一黑客攻击与俄罗斯地方选举有关&#xff0c;而选举委员会网站周日上午遭到了攻击。 他表示&#xff1a;“…

Android实现蝴蝶动画,飞舞的蝴蝶 - Android中的动画详解系列_Linux编程_Linux公社-Linux系统门户网站...

这一篇来使用逐帧动画和补间动画来实现一个小例子&#xff0c;首先我们来看看Android中的补间动画。Android中使用Animation代表抽象的动画类&#xff0c;该类包括下面几个子类&#xff1a;AlphaAnimation:透明改变动画。ScaleAnimation:大小缩放动画。TranslateAnimation:位移…

创建高安全性PHP网站的几个实用要点

2019独角兽企业重金招聘Python工程师标准>>> 大家都知道PHP已经是当前最流行的Web应用编程语言了。但是也与其他脚本语言一样&#xff0c;PHP也有几个很危险的安全漏洞。所以在这篇教学文章中&#xff0c;我们将大致看看几个实用的技巧来让你避免一些常见的PHP安全问…

实战J2EE—开发购物网站(一)

前言本文通过实战全程编写一个购物网站来讲解如何使用J2EE来建立企业级的网络应用&#xff01;本文针对的是像我这样的绝对初学者&#xff0c;如果您是高手就莫要见笑了&#xff01;一&#xff1a;搭建开发平台本文从实战出发&#xff0c;所以关于一些概念性的问题就不…

实战J2EE—开发购物网站(二)

第三步&#xff0c;安装配置jBuilder 7这里我安装的是weblogic版安装jBuilder不要把它装到带有空格的目录里如Prograih Files,或是中文目录中&#xff0c;不然编译时会出错的。安装很简单&#xff0c;不必多言&#xff0c;这里着重讲一下配置小技巧一&#xff1a;大…

实战J2EE—开发购物网站(三)

二&#xff1a;创建数据库小试牛刀oracle 8i(顺便我们练练手)(为了方便&#xff0c;我就将oracle 8i简写8i了)8i和9i确实有些不一样&#xff0c;不过在界面上区别不大&#xff0c;还是以我的oracle 8i为例为大家讲解一下吧&#xff01;既然是实战&#xff0c;首先我们为…

部署社交网站

项目案例&#xff1a;部署社交网站前言&#xff1a;本次项目是搭建一套动态网站服务器平台&#xff0c;在上面运行社交网站&#xff08;例如&#xff1a;人人网&#xff0c;开心网&#xff0c;天涯论坛&#xff09;。相关知识点在前面的课程中都有所涉及&#xff0c;今天的实验…

Python自动化备份系统及网站

随着目前IT迅猛的发展&#xff0c;自动化运维对于Linux运维人员也越来越重要&#xff0c;传统的运维方式靠大量的人力&#xff0c;现在也逐渐转向自动化运维&#xff0c;我们常见的跟自动化有关的软件有哪些呢。今天我们来简单列举一下&#xff1a;kickistart、puppet、cobbler…

SEO从业五年,软文编写经验总结

从事SEO工作五年&#xff0c;对于很多SEO的技术也有一些自己的经验和想法&#xff0c;在这里想和大家交流一下关于SEO中的主要一块——软文编写的经验和总结。一、最关键&#xff1a;蜘蛛喜欢收录并且有排名蜘蛛喜欢的&#xff0c;用户不一定喜欢;用户喜欢的&#xff0c;蜘蛛一…

php远程获取网站的关键字信息(并附:php判断字符串编码)

php远程获取网站的关键字信息&#xff08;并附&#xff1a;php判断字符串编码&#xff09; 很明显&#xff0c;php100是gbk编码的网站。现在获取它的关键字&#xff0c;并无乱码的显示出来&#xff0c;然后好保存到数据库。 123456789101112131415161718192021<meta http-eq…

百度seo排名点击器app_seo如何快速排名百度首页

seo排名首页是多个要素共同作用的结果&#xff0c;达成seo快速排名首页结果同样需要多个优化要素共同作用&#xff0c;一般而言seo不能快速起效。如果仅仅以快速而言&#xff0c;推荐的方法包括但不限于301永久重定向&#xff0c;快照劫持&#xff0c;模拟用户行为以及短时间增…