「Windows8以降での@Browserinfo("Platform")の返り値の問題」に対処する
概要
Windows 8 以降での @Browserinfo("Platform") の返り値の問題という技術情報が公開されました。
「問題報告番号 YSAIAQNAG7 として IBM Quality Engineering に報告されましたが、現在この問題の修正予定はありません」ということで、代替案を検討してみました。
browser.cnfとは?
ヘルプより抜粋。「IBM Domino のインストール時に」とありますが、IBM Notesクライアントにも入ってきます。IBM Dominoと同じようにデータディレクトリ(例:C:\notes\data)直下に存在します。
browser.cnf ファイルは、IBM Domino のインストール時にサーバーデータディレクトリに自動的にインストールされます。このファイルには、IBM Domino Web アプリケーションのレンダリングに使用されるブラウザの設定が入っています。具体的には、@BrowserInfo がブラウザのプロパティを確認するため、このファイルを使用します。
ブラウザのOSを返す部分は以下のようになっています。MacOSがMacOS一択であったり、OS2が存在するあたり時代を感じますね。
## Platform - String that indicates the OS platform of the browser.
## Notes client: Unknown
Property Platform String Unknown
Rule Win95 Win95
Rule Win95 Windows 95
Rule Win98 Win98
Rule Win98 Windows 98
Rule WinMe Win 9.x 4.90
Rule WinNT WinNT
Rule WinNT Windows\-NT
Rule Win2000 Windows NT 5.0
Rule WinXP Windows NT 5.1
Rule WinVista Windows NT 6.0
Rule Win7 Windows NT 6.1
Rule WinNT Windows NT
Rule MacOS Macintosh
Rule MacOS Mac_PowerPC
Rule OS2 OS/2
ここにWin8以降の設定がないため、正しい値が返ってこないようです。
対策1:@GetHTTPHeaderを利用し、User-Agentヘッダを取得。その結果を元に判別
@GetHTTPHeaderという@式を利用するとUser-Agentヘッダを取得可能です。User-AgentヘッダにはアクセスしてきたブラウザのOS情報が入ってくるため、この値をチェックすることで@Browserinfo("Platform")のような動きをする式を書くことができます。
「計算結果フィールド"OS"にアクセスしてきたブラウザのOSを返す」という想定で、このフィールドの値に埋め込む式は、たとえば次の通りです。
UserAgentHeader := @GetHTTPHeader("User-Agent");
OSLevelTemp := "";
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Win95"); "Windows 95"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Win98"); "Windows 98"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "WinMe"); "Win 9.x 4.90"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "WinNT"); "WinNT"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Windows-NT"); "Windows-NT"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Windows NT 5.1"); "Windows XP"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Windows NT 5.2"); "Windows XP (64ビット)/Windows Server 2003"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Windows NT 6.0"); "Windows Vista/Windows Server 2008"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Windows NT 6.1"); "Windows 7/Windows Server 2008 R2"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Windows NT 6.2"); "Windows 8/Windows Server 2012"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Windows NT 6.3"); "Windows 8.1/Windows Server 2012 R2"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Windows NT 10.0"); "Windows 10/Windows Server 2016"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Macintosh"); "MacOS"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "Mac_PowerPC"); "MacOS"; "");
OSLevelTemp := OSLevelTemp + @If(@Contains(UserAgentHeader; "OS/2"); "OS2"; "");
OSLevelTemp := @If(OSLevelTemp = ""; "Unkwon"; OSLevelTemp);
OSLevel := OSLevelTemp;
OSLevel
べた打ちが美しくないですが、ひとまずこのような感じで実現可能です。
この@式の注意点として、以下あげられます。
- Notesクライアントのブラウザでは"Windows-NT"という値が返るため、User-Agentヘッダからは判定できないケースがある
- User-AgentヘッダからはWindows 7 か Windows Server 2008 R2の切り分けはできない?
- Macの振り分けはbrowser.cnfと同じようにしたが、User-Agentヘッダはもう少し細かく出るため、@式に追加すれば切り分けは可能
- Linuxも同様にUser-Agentヘッダからある程度の判別は可能
なお、かつてGetURLHeaderInfoメソッドという、この@式と同じような挙動を示すNotesDatabaseオブジェクトのメソッドがあったようなのですが、リリース6以降無効になってしまったようです。残念…。
対策2:browser.cnfにWin8以降のエントリを追加
自己責任でリスクを確認のうえ実施ということになりますが、browser.cnfにWin8以降の部分を記載(折角なので、Windows Server 2008についても追加)するエントリは次のようになります。
※参考文献1よりUser-Agentヘッダの値を確認して記載。Windows NT 6.1以外の部分は実際に試せていないため、実装するのであれば要テスト。
Rule Windows7/WindowsServer2008_R2 Windows NT 6.1
Rule Windows8/WindowsServer2012 Windows NT 6.2
Rule Windows8.1/WindowsServer2012_R2 Windows NT 6.3
Rule Windows10/WindowsServer2016 Windows NT 10.0
"Rule"の次のエントリに空白を入れると、そこがデータの区切りと解釈されるため注意が必要です。
@Browserinfo("Platform")もUser-Agentヘッダとこの部分の比較を行っているため、@式と同様にMacやLinuxの判別も可能そうですが、試せていません。