浏览器的用户代理字符串的标准格式是啥?

Posted

技术标签:

【中文标题】浏览器的用户代理字符串的标准格式是啥?【英文标题】:What is the standard format for a browser's User-Agent string?浏览器的用户代理字符串的标准格式是什么? 【发布时间】:2011-02-05 18:43:25 【问题描述】:

是否有用于创建用户代理字符串的 RFC、官方标准或模板? iphone的用户代理字符串好像很奇怪...

Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_2 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) 版本/4.0手机/7D11 Safari/528.16

【问题讨论】:

iPhone 是否认真地将Mozilla/5.0 放在其用户代理的开头? @Slokun 为什么会有惊喜? IE 用户代理以Mozilla/4.0 开头。请记住,Mozilla 是最早制作的浏览器之一,所有其他浏览器都在不同程度上包含了其基础的一部分。 useragentstring.com 的解释是它应该只是指基于 Gecko 的浏览器(Netscape 和 Firefox),但大多数其他浏览器都包含它以表示它们与 Mozilla 兼容。 Mozilla/ 视为“不是 Lynx”。通常纯文本 = 不兼容 Mozilla。一些旧的 WML/HDML 功能手机浏览器也不识别为 Mozilla。 (有趣的事实:Lynx 之前的所有浏览器都死于痢疾或被咕噜肉吃掉。) everyone pretended to be everyone else, and confusion abounded 【参考方案1】:

User-Agent 标头是RFC7231 的一部分,它是RFC1945 的改进版本,其中指出:

User-Agent request-header 字段包含有关 发起请求的用户代理。这是出于统计目的, 跟踪协议违规,自动识别用户 代理以定制响应以避免特定用户 代理限制。用户代理应该包含这个字段 要求。该字段可以包含多个 product 标记(第 3.8 节) 和comments 识别代理和任何形成 用户代理的重要组成部分。按照惯例,product 令牌 列出了它们对识别的重要性的顺序 应用。

EBNF 定义:

   User-Agent      = "User-Agent" ":" 1*( product | comment )

其中product定义为:

   product         = token ["/" product-version]
   product-version = token
   token           = 1*<any CHAR except CTLs or separators>

comment 一样:

   comment         = "(" *( ctext | quoted-pair | comment ) ")"
   ctext           = <any TEXT excluding "(" and ")">

及其他规则,供参考:

   CTL             = <control characters, e.g. ASCII 0x00 through 0x0F and 0x7F>
   separators      = "(" | ")" | "<" | ">" | "@"
                     "," | ";" | ":" | "\" | <">
                     "/" | "[" | "]" | "?" | "="
                     "" | "" | SP | HT
   SP              = <ASCII space 0x20, i.e. " ">
   HT              = <ASCII horizontal tab 0x09, aka '\t'>

请注意,这意味着product 字符串不能包含空格,但comment 字符串可以。


示例:

以下是product 字符串的一些有效示例(带有和不带有product-version 字符串):

# Single `product` without product-version:
Foobar
Foobar-baz

# Single `product` with product-version:
Foobar/abc
Foobar/1.0.0
Foobar/2021.44.30.15-b917dc

以下是comment 字符串的一些有效示例;注意所有字符串是如何用匹配的括号括起来的 ( ):

# This was the default `comment` used by Internet Explorer 11:
(Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)

# You can put almost any text inside a comment:
(Why are you looking at HTTP headers? Go outside, find love, do some good in the world)

# Note that `comment` strings can also be nested, provided their delimiting parentheses are matched, for example:
(Outer comment (Inner comment))

由于User-Agent 标头的值由任意productcomment 字符串组成,这些都是有效的User-Agent 标头:

User-Agent: Foobar
User-Agent: Foobar/2021.44.30.15-b917dc
User-Agent: MyProduct Foobar/2021.44.30.15-b917dc
User-Agent: Tsom/OfraHaza (Life is short and love is always over in the morning) AnotherProduct

【讨论】:

谢谢,这正是我想要的。评论字段似乎没有标准格式。 这方面的一些例子对于不熟悉 EBNF 的读者来说是理想的选择。 (= 引用的 RFC 现在已过时。 tools.ietf.org/html/rfc7231 避免它。 有趣的是,RFC 7231 明确指出“使用[ing]其他实现的产品令牌以声明与它们的兼容性”是一个坏主意。 User-Agent 字符串可以是任何字符集吗?它可以包含例如俄语或中文字符吗?【参考方案2】:

这在请求标头部分的RFC 1945 中指定。不过,这不是一种非常标准化的格式,用户代理倾向于将他们想要的任何东西放在那里。

【讨论】:

谢谢!您的答案与 Paulo 的结合得出了完整的答案。 不客气!看起来 Paulo 的内容实际上更加完整和最新,因此请随意将他的内容标记为已接受。【参考方案3】:

是的,请参阅:mozilla website,但正如之前提到的那样。基本上你可以放任何你想要的东西。出于统计/分析目的,最重要的是,每个浏览器/操作系统都应该为自己标准化。

【讨论】:

以上是关于浏览器的用户代理字符串的标准格式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

从用户代理中识别 iOS 设备的好方法是啥?

Robots.txt - 多个用户代理的抓取延迟的正确格式是啥?

浏览器配置文件和用户代理在 UI 测试中的意义是啥?

http代理和SOCKS5代理的区别是啥

http代理关闭是啥意思

HTTP代理是啥意思?