* [CODE(HTTP)[User-Agent:]] 欄 (HTTP 他) [59] [[HTTP]] その他の[[プロトコル]]で使われている [DFN[[CODE(HTTP)[User-Agent:]] 欄]]は、 使用されている[[利用者エージェント]]を表します。 [61] '''誘導''': [Q[利用者エージェント]]一般については [Q[[[利用者エージェント]]]]および [Q[[[User Agent]]]] をご覧下さい。 [[CGI]] での利用に関しては [Q[[CODE(CGI)[[[HTTP_USER_AGENT]]]]]] の項をご覧下さい。 [[HTTP]] その他に関してはここをご覧下さい。 その他関連プロトコル要素に関しては >>62 をご覧下さい。 [[#comment]] * 仕様書から ** RFC 1945 (HTTP/1.0) 10.15; RFC 2068 (HTTP/1.1) 14.42; RFC 2616 (HTTP/1.1) 14.43 User-Agent > The User-Agent request-header field contains information about the user agent originating the request. This is for statistical purposes, the tracing of protocol violations, and automated recognition of user agents for the sake of tailoring responses to avoid particular user agent limitations. [DEL[Although it is not required, user agents should]] [INS[User agents SHOULD]] include this field with requests. The field can contain multiple product tokens (Section [DEL[3.7]] [INS[3.8]]) and comments identifying the agent and any subproducts which form a significant part of the user agent. By convention, the product tokens are listed in order of their significance for identifying the application. [DFN[[CODE(HTTP)[User-Agent]] [[要求頭欄]]]]は、要求を作成した[[利用者エージェント]]についての情報を含みます。 これは、統計目的、プロトコル違反の追跡、および特定利用者エージェントの制限を避けるために応答を手直しするための利用者エージェントの自動認識のためのものです。 利用者エージェントは、この欄を要求に含める'''べきです'''。 この欄は、複数の [CODE(ABNF)[[[product]]]] 字句ならびに利用者エージェントおよび利用者エージェントの重要な部分を形成する部分製品を識別する注釈を含めることができます。 慣習的に、 [CODE(ABNF)[product]] 字句は、その応用を識別するのに有意な順に列挙します。 > - User-Agent = "User-Agent" ":" 1*( product | comment ) > Example: - User-Agent: CERN-LineMode/2.15 libwww/2.17b3 [DEL[ > Note: Some current proxy applications append their product information to the list in the User-Agent field. This is not recommended, since it makes machine interpretation of these fields ambiguous. 注意: 既存の[[串]]応用の中には [CODE(HTTP)[User-Agent]] 欄の並びに自身の製品情報を付加するものもあります。 これは、この欄の機械的解釈が曖昧になってしまうので、推奨しません。 > Note: Some existing clients fail to restrict themselves to the product token syntax within the User-Agent field. 注意: 既存のクライアントの中には [CODE(HTTP)[User-Agent]] 欄の product 字句構文に反しているものもあります。 ]DEL] [INS[ 注: 修正部はすべて RFC 1945→RFC 2068 での変更点。 ]INS] ** RFC の部分の License [[RFCのライセンス]] * USEFOR draft (電子ニュース・メッセージ) での規定に関して [44] product の中身が [[HTTP]] では [[token]] でしたが、 usefor では [[value]] になりました。このおかげで、漢字を使った名前とかも入れられます。 - [45] User-Agent-content = product-token *( CFWS product-token ) - [46] User-Agent-header = "User-Agent" ":" SP User-Agent-content *( ";" other-parameter ) - [47] product-token = value [ "/" product-version ] - [48] product-version = value - [17] [[ietf-usefor]] の議論をちょっと目を離した隙に、 [CODE(ABNF)[product]] が [CODE(ABNF)[token]] に変わってしまいました。 ([[HTTP]] と同じになった。) だから [SAMP["A User Agent"]] も [SAMP["なんかの利用者エージェント"]] も駄目になりました。 (なんでそうなったのかは、議論を追えてないので分かりませぬ。) - [18] ''17'': [[電子ニュース]]記事の[[国際化]]を目指した [[usefor-article]] にとって大きな後退です。たとえこのままの仕様で [[RFC]] になってしまっても、 [[UTF-8]] が使える''旧仕様のメッセージを流し続けましょう''。そうすれば son-of-usefor でちゃんとなるかもしれん。 - [26] [WEAK[2002-12-22 21:46]] ''>>10'': [[comment]] の中なら [[encoded-word]] でも OK ですね。 - [27] [CODE(ABNF)[product-version]] に [[quoted-string]] を使った例: [CODE[User-Agent: FooNews/"1.0(Beta1)"]] - [28] [CODE(ABNF)[encoded-word]] を [CODE(ABNF)[comment]] 中に使った例: [CODE[User-Agent: "Bar@"/1.2 (=?us-ascii?q?Micro=24oft_Windoze_XP?= ; i686)]] - [31] [WEAK[2002-12-25 18:08]] ''>>17'': まだ関係する記事を全部読んでないんですが、どうも電子メイルに gatewaying する時に [CODE(ABNF)[product]] の部分が UTF-8 だったらどうするのかが問題になって、 [[encoded-word]] にするのは鬱だし、いっそのことやめちまえになったっぽいです。'''ま た e n c o d e d - w o r d か !''' [[#comment]] * 使用例 ** RFC 2616 に適合する例 - User-Agent: CERN-LineMode/2.15 libwww/2.17b3 - User-Agent: tin/1.2-PL2 - User-Agent: tin/1.3-950621beta-PL0 (Unix) - User-Agent: tin/unoff-1.3-BETA-970813 (UNIX) (Linux/2.0.30 (i486)) - User-Agent: tin/pre-1.4-971106 (UNIX) (Linux/2.0.30 (i486)) - User-Agent: Mozilla/4.02b7 (X11; I; en; HP-UX B.10.20 9000/712) - User-Agent: Microsoft-Internet-News/4.70.1161 - User-Agent: Gnus/5.4.64 XEmacs/20.3beta17 ("Bucharest") - User-Agent: Pluto/1.05h (RISC-OS/3.1) NewsHound/1.30 - User-Agent: inn/1.7.2 - User-Agent: telnet - User-Agent: T-gnus/6.14.4 (based on Gnus v5.8.7) (revision 01) REMI/1.14.1 (=?ISO-8859-4?Q?Mushigawa=F2sugi?=) Chao/1.14.1 (=?ISO-8859-4?Q?Rokujiz?= =?ISO-8859-4?Q?=F2?=) APEL/10.2 MULE XEmacs/21.2 (beta33) (Melpomene) (i686-pc-linux) [[#form:'%text (id => field-body, label => {User-Agent: }, size => 20); (%text(id => name, label => {UA ソフトウェア名}, size => 20);; %text(id => comment, label => {備考}, size => 20);) %submit (label => {追加});':'-[%index;] [CODE(HTTP)[User-Agent: %text (source => field-body);]] %text (source => name, prefix => {(}, suffix => {)});%text (source => comment, prefix => { ※});']] ** USEFOR draft に適合する例 - HTTP に適合するものは、 usefor にも適合します。 - User-Agent: "秀丸エディタ"/3.0 "Microsoft(R) Windows(R) Millenium Edition" (Windows Me) - [49] User-Agent: "西瓜割"/1.5 Message-pm/1.23 [[#form:'%text (id => field-body, label => {User-Agent: }, size => 20); (%text(id => name, label => {UA ソフトウェア名}, size => 20);; %text(id => comment, label => {備考}, size => 20);) %submit (label => {追加});':'-[%index;] [CODE(HTTP)[User-Agent: %text (source => field-body);]] %text (source => name, prefix => {(}, suffix => {)});%text (source => comment, prefix => { ※});']] ** 間違った例とこれへの対処について - [1]User-Agent: Mozilla/4.7 [ja]C-{C-UDP; EBM-SONY2} - [2]User-Agent: DoCoMo/1.0/N503i/c10 - [3]User-Agent: H-Hash@StudyingHTTP.NET - [4]User-Agent: HttpGet/1.0(Win32; GUI; ix86) - [5]User-Agent: ネットスケープ 2.0 [[#form:'%text (id => field-body, label => {User-Agent: }, size => 20); (%text(id => name, label => {UA ソフトウェア名}, size => 20);; %text(id => comment, label => {備考}, size => 20);) %submit (label => {追加});':'-[%index;] [CODE(HTTP)[User-Agent: %text (source => field-body);]] %text (source => name, prefix => {(}, suffix => {)});%text (source => comment, prefix => { ※});']] [34] 間違った例でもそれなりに使われている以上、対応する必要もあるでしょう。 (でも頭が痛いなあ。) [6] >>1 は、 [ja] 以降の部分で []{}; を使うのを止めるか、全体を comment にしてしまうべきものでしょう。 usefor 的には {} は OK なんですが。あるいは全体を quoted-string にするとか。 読む側としては、不正だから無視するのが一番楽。 どうしても読むなら、 http-token の代わりに *<"/" を除く CHAR> を使うとか。それでも後半が2部分に分かれますが。 [7] >>2 は、 N503i 以降を comment にするか、区切りを "/" じゃなくて "-" にするとかすべきだったと。読む実装側は・・・悩ましい。 [8] >>3 は、 usefor なら quoted-string にしておくとか。 HTTP では無理だねえ。 (こんなところにメイルアドレスなんて入れるなよ。) 読む側は 1 と同じ対処かな。 [9] >>4 は、 comment の前に SP 入れなさい、って話。 HTTP では必須らしいけど、 usefor 的には無くても OK だねぇ。互換性のために入れた方がいいと 思うけど。読む側は無くても解釈できるのが望ましかろう。 [10] >>5 は、実際、生 [[ISO-2022-JP]] (ならまだ良い。) とか [[EUC-JP]] とか [[シフトJIS]] とか入れる人が少なくないらし。御丁寧にも [[encoded-word]] 使う人とかもいるらしいねえ。 なんにせよ、 http-token 以外の文字を 使う時は、 quoted-string にしましょ。 (但し usefor only.) 古い版の MacIE は、日本語版では「ネットスケープ 2.0」とかほざくらしい。 シフト JIS でね。英語版では 「Mozilla/2.0」だったと思われ。藁。 [35] からめぼしい(謎)もの。 (適当に上の方から。) - [11]User-Agent: A.G.E.N.T. http://masui.net/agent/libwww-perl/5.44 - [12]User-Agent: Acoon Robot v1.50.001 (www.acoon.de) [13] >>11 URI 生書きいや〜ん。 >>12 構文としては問題ないけど''名前/版''形式きぼんぬ。 - [51] どうせ規格に違反するなら、 >>44 の usefor の改良された方法で [[quoted-string]] を使うようにしていった方が、見よう見まねの実装で正しい値を使うようになるんじゃないかと思います。(甘いかな。) ですから新しい実装は、 >>44 の usefor の形式に合致する値を出力するのが望ましいと考えられます。 - [52] >>51 の考え方からすれば、現実的に表現力が小さいだけで何の役にも立っていない今の HTTP の書式を無理に使うよりは、 >>44 の usefor のより自由な方式に (現状では HTTP RFC と一致しなくても) 切り替えていった方が良いかもしれません。 - [53] >>10 HTTP/1.0 ([[RFC1945]]) では、 [CODE(ABNF)[%x80-FF]] は [[ISO-8859-1]] と解釈しても'''良い'''のであって強制ではありませんから、'''注釈の中なら'''シフト JIS を入れたり日本語 EUC を入れたり Big5 を入れたりしても問題ありませんね。して欲しくないけど。更に注釈外の生書きはもちろん駄目だけど。 - [54] >>53 また、 [[encoded-word]] を使う場合も注釈内なら構いませんが、注釈外はいけませんね。 (HTTP の場合) - [55] 但し、 >>44- のように電子ニュースの手法を使って勝手に拡張してしまうなら、 [SAMP["=?us-ascii?q?A_Sample_User_Agent?= (ASUA)"/"2.45 =?us-ascii?q?=28Lilly=29?="]] みたいなのもありだと思います。 ([[MIME]] 的には [[quoted-string]] の中に [CODE(ABNF)[encoded-word]] を入れるのはよくないんだけど、 HTTP 的にはあまり気にしない。) - [56] もちろん、 >>55 の例は例であって、 US-ASCII だけの文字列を [CODE(ABNF)[encoded-word]] にするなんてばかげたことは (普通は) しないで下さい、念のため。 [[#comment]] ** 色々な実装における値の付け方 - [20] Mozilla での UA 名の指針 -- [14] '''user-agent string''' --- (原文) --- (和訳) - [21] ''J-Sky Web/技術資料 ユーザーエージェントについて'' - [22] ''iモード対応HTMLの考え方'' - [23] ''NTT東日本:Lモード'' から入手できる技術条件説明書 - [24] [[Monazilla]] - [25] [[DOLIB]] 1.00 - [60] [[au]]] ''技術情報'' [64] [CITE[端末属性通知プロトコルの標準提案]] ([TIME[2002-09-05 20:59:22 +09:00]] 版) ([[名無しさん]]) [[#comment]] ** 実際に使われている値の収集 - [19] [[HTTPのUserAgentの一覧]] - [43] '''Some Gripes on User-Agent''' [[UA]] の実例が一杯。 [63] [CITE@en[The ELinks Manual]] ([[Petr Baudis, Jonas Fonseca Madsen, Miciah Dashiel Butler Masters]] 著, [CODE[2007-03-18 16:03:15 +09:00]] 版) ([[名無しさん]]) [[#comment]] * 利用者エージェント名詐称問題 [36] ⇒[[MozillaとcompatibleなUAとは?]]を参照。 * User-Agent: 欄の値による処理の分岐 [50] 実際のところ、規格違反の文字列を使う例や詐称により実際の情報が注釈内に押し込まれている例が多すぎることから、仕様に基づいた parser を作って前半(名前)・後半(版)を見て処理を云々というのは現実的でなく、そうした処理をする多くの実装 ([[CGI]] script やサーバーなど。) は[[正規表現]]を使って処理しています。確かにこれが最も現実的な方法でしょう。 [57] ''ブラウザ判別では"Gecko"を調べてください - Web標準普及プロジェクト'' [58] [[RFC2936]] HTTP MIME 型取扱器判別 [[#comment]] * UA: 欄と安全性 [15] Security や privacy を理由に、 UA: 欄や [[Server]]が送られることに懸念を示す人がいます。 確かに個々の場合において問題が発生する可能性はあるでしょう。 (例えば UA: 欄に特定の文字列が入っていたら攻撃する人がいるとか。) しかし一般論として、例えばこれらの情報を送らないことで安全性が向上するということはありません。 - [16] >>15 わざわざソースから削って出力させなくするような人もいるらしいですが、安全性の向上を狙っているならはっきり言って無駄なことです。 [[#comment]] * Client-Specific Web Services by Using User Agent Attributes [40] UA: にクライアント情報を一杯詰め込んじまおうという '''Client-Specific Web Services by Using User Agent Attributes''' W3C NOTE 12-30-1997。 仕様考えた会社位しか実装例が無いらしい(w)。 - [41] User-Agent: AVE-Front/2.0 (BrowserInfo Screen=640x480x256; InputMethod=REMOCON,KEYBOARD; Page=512K; Product=XXXX/Internet-TV; HTML-Level=3.2; Language=ja.JIS; Category=TV; CPU=SH2; Storage=NO;) [42] 一応 [[BNF]] とかでちゃんと定義してある。 = Prop_def = "(" "BrowserInfo" Prop_items ")" = Prop_items = Prop_item | Prop_items Prop_item = Prop_item = Prop_name "=" Prop_value ";" = Prop_name = STRING = Prop_value = STRING > The upper case and lower case in describing Prop_name and Prop_value > have to be discriminated. = Prop_name = "Screen" | "InputMethod" | "Page" | "Product" | "HTML-Level" | "Language" | "Category" | "CPU" | "Storage" "Screen", "InputMethod", "Page", "Product", "HTML-Level" は強く推奨らしいぞ。 "Screen" の値: width (pixels) "x" height (pixels) "x" colors (colors は 2, 4, 8, 16, 32, 64, 128, 256, 32K, 64K, 16M のどれか) "InputMethod" の値: PEN, KEYBOARD, MOUSE, REMOCON, BUTTON, JOG, ... のどれか(複数可)を、読点区切り。 (例では読点の後に SP が。) 以下説明略。面倒だ:-) 理解する側の実装は (まじめにしよーとすると) 面倒だと思うぞ。値の定義がいい加減だ。 ところで [[HTML]] 1.1 ってなに? [[#comment]] ** 他との関係 [62] [CODE(822)[User-Agent:]] 欄があるプロトコル: - [[RFC 822]] 系[[電子メイル]]・[[電子ニュース]] - [[HTTP]] - [[RTSP]] - [[SIP]] [CODE(822)[User-Agent:]] 欄に関係するプロトコル要素: - [CODE(CGI)[[[HTTP_USER_AGENT]]]] [[メタ変数]] ([[CGI]]) - [CODE(CGI)[[[SIP_USER_AGENT]]]] [[メタ変数]] ([[SIP CGI]]) - [CODE(JS)[[[navigator]]]] 物体 ([[DOM水準0]]) - [CODE(HTTP)[[[Server]]:]] 欄 ([[HTTP]], [[RTSP]], [[SIP]]) [[#comment]] ** メモ [[#comment]] * メモ [65] [CITE[UserAgent - iPhone 3G DevWiki]] (Referenced: [TIME[2009-08-25T18:40:39+09:00]]) [66] [CITE[IRC logs: freenode / #whatwg / 20100617]] ([TIME[2010-06-27 14:30:04 +09:00]] 版) [67] [CITE[IRC logs: freenode / #whatwg / 20100913]] ( ([TIME[2010-09-26 22:31:37 +09:00]] 版)) [68] [CITE[Chrome 11 におけるユーザーエージェント文字列の変更 - Google Japan Developer Relations Blog]] ( ([TIME[2011-06-07 20:00:25 +09:00]] 版)) [69] [CITE[Bug 690287 – Tracking bug for UA sniffers failing to handle a two-digit version]] ( ([TIME[2011-10-04 08:13:27 +09:00]] 版)) [70] [CITE[Request Headers in the HTTP protocol]] ( ([TIME[2001-11-29 11:01:38 +09:00]] 版)) [71] [CITE@en[Gecko user agent string reference - MDN]] ( ([TIME[2012-07-06 00:45:55 +09:00]] 版)) [72] [CITE@en[Chrome for Android User-Agent - Google Chrome Mobile — Google Developers]] ( ([TIME[2012-06-28 19:56:53 +09:00]] 版)) [73] [CITE@en[IE10 のユーザー エージェント文字列が更新されました - IEBlog 日本語 - Site Home - MSDN Blogs]] ( ([TIME[2012-07-17 03:51:15 +09:00]] 版)) [74] [CITE[OperaのUAは以後ずっとOpera/9.80になります - by edvakf in hatena]] ( ([TIME[2012-07-17 03:56:00 +09:00]] 版)) [75] [CITE@en[Changes in Opera’s user agent string format - Dev.Opera]] ( ([TIME[2012-07-17 03:56:23 +09:00]] 版)) [76] [CITE@ja[Google ウェブマスター向け公式ブログ: スマートフォン版 Googlebot-Mobile の導入について]] ( ([TIME[2012-07-18 14:36:02 +09:00]] 版)) [77] [CITE@en[draft-karcz-uuas-00 - Unified User-Agent String (UUAS)]] ( ([TIME[2012-04-30 13:21:14 +09:00]] 版))