Ubuntu下使用Chrome打开CSDN解决open xdg-open?问题

背景

博主最近将开发环境完全搬到了Ubuntu上,并且经常使用Chrome浏览国内程序员社区CSDN。但是博主在使用CSDN时遇到了困难,它总是问我open xdg-open?显然是CSDN想要打开某个程序,但是这个程序在我的机器上并没有安装,Chrome浏览器出于安全策略总是要问我是否打开此应用,每次都要点好几下才能将它关掉,对像博主一样的程序员们造成了学习上的干扰,于是博主本者需求驱动学习的态度对这个open xdg-open?进行了探索。
在这里插入图片描述

探索

查其原因

博主发现,在每次CSDN要使用open xdg-open时浏览器地址栏右边都会显示检测到不安全的脚本,并且浏览器地址栏左边会显示使用http协议时的不安全或者部分链接不使用https时的感叹号。既然CSDN想加载脚本然后貌似被Chrome给禁了?于是点击浏览器右边的检测到不安全脚本将此脚本放行,果然有效,浏览器界面刷新了,网页也变成了https,然后open xdg-open这个玩意也消失了。但是这个办法治标不治本,我尝试对此站点放行全部JS脚本都没用,如果把它JS脚本全部禁止又会影响正常体验。

强制安全

既然CSDN没有用https时才会出现这个问题,那么我们想办法让它完全https能解决问题吗?这个网站是https网站,但是偶尔会出现不安全的警示,说明偶尔从http跳转到https请求,怀疑可能是DNS污染导致请求异常,于是在终端执行nslookup blog.csdn.net查询DNS请求并将其IP写死到/etc/hosts文件中。博主发现这样做之后出现异常的情况目测会少很多,但是偶尔可能还会出现没有使用https导致不安全的异常,怎么办呢?使用HSTS,将CSDN网站从浏览器的角度将请求强制转化成https即可,具体方法不再赘述,这样确实不会再次出现不安全的提示,但是偶尔还是会有感叹号有某些请求不使用https的提示,并且同时伴随着open xdg-open的出现。什么情况?使用HSTS后还是会有异常?

抓住本质

我打开浏览器开发者调试工具检测网页加载时的网络请求情况,等它基本页面加载好但是未完全加载结束时点击左上角的叉停止页面加载,发现始终有一个js脚本加载不出来,同时会有几个链接是使用xdg-open打开的其他应用的链接(如打开QQ和打开京东等等)。博主豁然开朗,我的浏览器是在Linux平台下的,安卓也是Linux下的,CSDN为了移动端的营销会调起某些其他合作伙伴的应用,这个调起的xdg-open脚本是很容易就加载出来的,然后会通过网络请求加载一个判断是不是安卓设备的脚本,但是这个脚本被Chrome浏览器认为不安全所以禁止了它的加载,所以它就把我当成了安卓设备反复调起一些安卓下的应用。博主不准备跟它硬着干,而是准备绕着走,我在Windows下很多年(其实也就一年)都没有这样的问题,那么我把浏览器的UA换成Windows平台的然后再使用CSDN不就没有这种问题了么?但是我不希望全局换成Windows,因为在下载某些应用时网站无法判断我是Linux平台无法给我正确的下载包。所以我在浏览器扩展应用商店搜索UA切换工具找到了User-Agent Switcher and Manager然后使用白名单模式将所有发送到CSDN的请求使用Windows的User-Agent,然后再打开几个CSDN博客来尝试看看还会不会有烦人的open xdg-open,试了很多个发现均没有这样的问题,至此问题已基本解决。

解决问题

上面的方法其实也还是治标不制本,偶尔还是会有广告弹出,于是我想了几个治本的思路。首先我们可以写浏览器扩展检测使用xdg-open需要打开的协议然后使用浏览器扩展将这种协议的URL屏蔽,但是在扩展商店逛了一圈并不能发现这样的插件,自己开发的话难度偏大。然后我又想到准备个xdg-open的黑洞把它要调用的广告软件往里面引来调用我准备好的无用软件,这个很简单,在/usr/share/applications里面准备好.desktop文件然后在文件里面指定好协议,然后再用xdg-mime命令行工具指定xdg-open要打开的应用所使用的协议的所使用的软件。最后确实可以引导它调用我自己写的软件,我自己的软件的作用是输出调用信息到文件中。但是这个方法看似很好其实也还有弊端,就是最新版本的Chrome软件无法保存打开xdg-open的默认程序和相关信息,每次都要手工同意打开,不能像老版本一样能always使用,解决方法是下载稍稍偏老版本的浏览器使用,这当然不方便。最后我想到的思路是完全屏蔽这个弹窗,但是这个弹窗近似于浏览器的系统弹窗而不是web界面调用js形成的弹窗,不确保能成功,我抱着试试看的态度找到了Pop up blocker for Chrome,用它屏蔽了CSDN调用其他应用时弹出的弹窗。至此问题全部完美解决。最后吐槽以下国产平台吃像难看,国内急需统一的应用通知推送接口来避免这样的互相唤醒行为。

终极方案

经过我的亲身体验,我发现在Ubuntu平台使用Chromium才是最方便的,我们可以将Chrome删除然后安装Chromium。请注意要用apt安装不要用snap安装具体不多解释。

afu@debian $ sudo dpkg --remove google-chrome-stable
afu@debian $ sudo apt install chromium-browser 

总结

探究问题要善于抓住问题的本质,懂的东西越多,解决问题的能力也就越强,不要以为很多东西没用,太急功近利,这些BUG在很多时候驱动学习,教会人们思考,是程序员的基本功,解决了问题也会感到非常开心,希望读者也能解决跟我一样的困惑。

发布了19 篇原创文章 · 获赞 0 · 访问量 680
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览