浏览器-UserAgent

1. UA 是什么
  1. User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
    简单来说,就是指谁来代替我们访问网页的,获取客户端信息。
  2. UA的作用一般是用来反爬虫,一般用python写的爬虫程序,UA是有带 ‘python-requests’ 的,有些服务器就会根据UA设置反爬措施
2. UA在各个浏览器的参数
  1. 各个浏览器的navigator.userAgent

    IE11: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
    	
    Chrome: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/82.0.4077.0 Safari/537.36
    	
    Firefox: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:68.0) Gecko/20100101 Firefox/68.0
    	
    Safari:  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15
    	
    edge: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063
    	
    Opera:	Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.100
    
  2. 各个浏览器的正则匹配

    rwebkit = /(webkit)[ \/]([\w.]+)/,//webkit
    ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,//opera
    rmsie = /(msie) ([\w.]+)/,//ie
    rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,//mozilla
    
    通过userAgent,我们可以看到chrome可以通过以下方式匹配到,但是因为和safari一样,都带有“safari”,我们可以把它放在rwebkit.前进行匹配
    rchrome=/(Chrome)[ \/]([\w.]+)/
    
    同样firefox也可以这么做,把它放在rmozilla前面进行判断
    rfirefox=/(Firefox)[ \/]([\w.]+)/
    

3. User-Agent字段解释

chrom浏览器

Mac: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/82.0.4077.0 Safari/537.36

Win10: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36

User-Agent通常格式:

Mozilla/5.0 (平台) 引擎版本 浏览器版本号

  1. 第一部分:Mozilla/5.0
    由于历史上的浏览器大战,当时想获得图文并茂的网页,就必须宣称自己是 Mozilla 浏览器。此事导致如今User-Agent里通常都带有Mozilla字样,Mozilla/x.0 的意思是,兼容Mozilla渲染引擎。出于对历史的尊重,大家都会默认填写该部分。

  2. 第二部分:平台这部分可由多个字符串组成,用英文半角分号分开
    如果是MAC,那么就是Mac OS X ,系统版本是10.13.6。
    如果是Win10,那么就是Windows NT 10.0,Win64; x64是指操作系统是64位的。

    Windows系统下:
    Windows NT 5.0 // 如 Windows 2000 
    Windows NT 5.1 // 如 Windows XP
    Windows NT 6.0 // 如 Windows Vista 
    Windows NT 6.1 // 如 Windows 7
    Windows NT 6.2 // 如 Windows 8
    Windows NT 6.3 // 如 Windows 8.1
    Windows NT 10.0 // 如 Windows 10
    Win64; x64 // Win64 on x64
    WOW64 // Win32 on x64
    
    Linux系统下:
    X11; Linux i686; // Linux 桌面,i686 版本
    X11; Linux x86_64; // Linux 桌面,x86_64 版本
    X11; Linux i686 on x86_64 // Linux 桌面,运行在 x86_64 的 i686 版本
    
    macOS系统下:
    Macintosh; Intel Mac OS X 10_9_0 // Intel x86 或者 x86_64
    Macintosh; PPC Mac OS X 10_9_0 // PowerPC
    Macintosh; Intel Mac OS X 10.12; // 不用下划线,用点
    
  3. 第三部分:引擎版本

    AppleWebKit/537.36 (KHTML, like Gecko)…Safari/537.36,历史上,苹果依靠了WebKit内核开发出Safari浏览器,WebKit包含了WebCore引擎,而WebCore又从KHTML衍生而来。由于历史原因,KHTML引擎需要声明自己是“类似Gecko”的,因此引擎部分这么写。再后来,Google开发Chrome也是用了WebKit内核,于是也跟着这么写。借用Littern的一句话:“Chrome 希望能得到为Safari编写的网页,于是决定装成Safari,Safari使用了WebKit渲染引擎,而WebKit呢又伪装自己是KHTML,KHTML呢又是伪装成Gecko的。同时所有的浏览器又都宣称自己是Mozilla。”。不过,后来Chrome 28某个版本改用了blink内核,但还是保留了这些字符串。而且,最近的几十个版本中,这部分已经固定,没再变过。
    简单来说,就是在浏览器开发过程了,为了保证浏览器的效果,需要假装成是其他的浏览器,这样一直相互引用,所以才导致现在的引用字符串这么长,

  4. 浏览器版本
    以Mac 的Chrome浏览器为例,其中82.0 是大版本,4077是持续增大的一个数字,而0则是修补漏洞的小版本。

4. 请求头(request header)内容
  1. 浏览器自动生成的请求。如果是通过浏览器发送的请求,那么以下这些消息头只能由浏览器控制,而不能用XMLHttpRequest对象来修改,即不能通过JavaScript修改。这个是w3c建议的标准。
  2. 浏览器插件,javascript脚本增加或者修改的header。JS能够控制浏览器发起请求,也能在这里增加一些header,但是考虑到安全和性能的原因,对JS控制 header的能力做了一些限制,比如host和cookie, user-agent等这些字段,JS是无法干预的。
    现在的浏览器对UA都设置了自动选择,但也给开发保留了自定义设置的功能,通过控制台的 Network conditions 就可以自定义UA了。
  3. 中间代理。如果用户请求要经过一些中间代理(比如公司网关),中间代理能够查看和修改用户的全部数据,任何头部字段。除非我们使用了HTTPS。
  • Accept-Charset
  • Accept-Encoding
  • Access-Control-Request-Headers
  • Access-Control-Request-Method
  • Connection
  • Content-Length
  • Cookie
  • Cookie2
  • Content-Transfer-Encoding
  • Date
  • Expect
  • Host
  • Keep-Alive
  • Origin
  • Referer
  • TE
  • Trailer
  • Transfer-Encoding
  • Upgrade
  • User-Agent
  • Via
至于能不能修改 http header
  1. 一般来说,是不建议修改UA的,有很多网站是根据这个字段做内容适配的,比如PC和手机肯定是不一样的内容。还有最重要的host字段,如果随便修改这个值,比如将腾讯首页改成百度一下,你就知道,那目的网站也返回不了正确的内容。
  2. 有一些字段能够修改,比如connection,cache-control等。不会影响你的正常访问,但有可能会慢一点。
  3. 还有一些字段可以删除,比如你不希望网站记录你的访问行为或者历史信息,你可以删除cookie,referfer等字段。
  4. 当然你也可以自定义构造任意你想要的字段,一般没什么影响,除非header太长导致内容截断。通常自定义的字段都建议X-开头。比如X-test: lance。
5.总结

这次是因为项目中涉及到了外网访问,需要设置 User-Agent, 所以调研了一些资料,不过现在看来,如果项目是通过浏览器访问,那么UA必定是修改不了的,虽然 Web API 中的 Fetch 有提到可以在 header 中修改 User-Agent, 不过多次尝试仍然设置失败。现在看来是当 fetch 不通过浏览器,直接通过JS 发请求,才有可能设置成功,具体走 JS 发请求设置UA的,我也没试过,以后有机会再试试吧。

参考链接
  1. 请教 JS 如何修改 UserAgent
  2. User Agent参数的各个字段
  3. HTTP请求头之User-Agent
  4. jQuery设置ajax请求中的User-Agent
  5. 用浏览器访问网址时,请求头(request header)是根据什么生成的?

你可能感兴趣的:(浏览器)