私のWebアプリプロジェクトにはログ機能が含まれているため、訪問者のアクセス元(リファラーURL)、人気のあるユーザーエージェント、最も人気のあるページなどを確認できます。ログはSQL Serverに保存され、ユーザーに問い合わせるとエージェント大きい(ほぼ100行)CASEステートメントを使用して、文字列一致を使用してユーザーエージェントを分離します(つまり、ユーザーエージェントに「Firefox/9」という文字列が含まれている場合は、Firefox 9です)。これを行うためのより良い方法がありますので、新しいブラウザのリリースに対処するためにそのCASEステートメントに継続的に追加する必要はありませんか?
また、あまり一般的ではない、奇妙な/未知のユーザーエージェントにどのように対処する必要がありますか?私はログに次のようなものを見ましたが、それらが何であるかについての良い情報をオンラインで見つけることができませんでした:
WordPress/3.3.1; http://www.facecolony.org
Mozilla/4.0 ( http://www.hairirons.org redips; <a href=http://hairirons.org/>chi hair iron</a>)
ボット/クローラーであると思われますが、それらが指しているサイトはWebクローラーを参照していないようです(または時々利用可能です)。他のユーザーエージェントは私には馴染みのないものですが、「ボット」や「スパイダー」などが含まれているため、ボットであることがわかります。
SQLクエリを使用することは、これに対する最も効果的なアプローチではないことに完全に同意します。ただし、必要なログが既にSQLにあり、それが1つのオフまたはデータサイズがアプローチの改善を保証するほど大きくない場合、開始点として使用できる便利な式があります...
こちらのサラスの投稿に基づきます: http://www.consultsarath.com/contents/articles/KB000009-tsql-function-how-to-parse-useragent-to-extract-browser-name.aspx 、ただしIEの互換性モードが有効になっている場合、さまざまなIEユーザーエージェント文字列のバリエーションを処理するように洗練されています。ここに記載されているように http://msdn.Microsoft.com/en-us/library/ms537503( v = vs.85).aspx 。
SELECT CASE
WHEN PATINDEX('Mozilla/5.0+(compatible;+MSIE+10.0%',[cs(User-Agent)]) > 0 THEN 'Internet Explorer 10.0 (standards mode)'
WHEN PATINDEX('%Trident/6.0%',[cs(User-Agent)]) > 0 THEN 'Internet Explorer 10.0 (compat mode)'
WHEN PATINDEX('Mozilla/5.0+(compatible;+MSIE+9.0%',[cs(User-Agent)]) > 0 THEN 'Internet Explorer 9.0 (standards mode)'
WHEN PATINDEX('%Trident/5.0%',[cs(User-Agent)]) > 0 THEN 'Internet Explorer 9.0 (compat mode)'
WHEN PATINDEX('Mozilla/4.0+(compatible;+MSIE+8.0%',[cs(User-Agent)]) > 0 THEN 'Internet Explorer 8.0 (standards mode)'
WHEN PATINDEX('%Trident/4.0%',[cs(User-Agent)]) > 0 THEN 'Internet Explorer 8.0 (compat mode)'
WHEN PATINDEX('Mozilla/4.0+(compatible;+MSIE+7.0%',[cs(User-Agent)]) > 0 THEN 'Internet Explorer 7.0'
WHEN PATINDEX('Mozilla/4.0+(compatible;+MSIE+6.0%',[cs(User-Agent)]) > 0 THEN 'Internet Explorer 6.0'
WHEN PATINDEX('Mozilla/4.0+(compatible;+MSIE+5.0%',[cs(User-Agent)]) > 0 THEN 'Internet Explorer 5.0'
WHEN PATINDEX('%Firefox%',[cs(User-Agent)]) > 0 THEN 'Mozilla ' + REPLACE(SUBSTRING([cs(User-Agent)], PATINDEX('%Firefox%',[cs(User-Agent)]), 100),'/', ' ')
WHEN PATINDEX('%Chrome%',[cs(User-Agent)]) > 0 THEN 'Google ' + REPLACE(SUBSTRING([cs(User-Agent)], PATINDEX('%Chrome%',[cs(User-Agent)]), PATINDEX('%Safari%',[cs(User-Agent)]) - PATINDEX('%Chrome%',[cs(User-Agent)])),'/', ' ')
WHEN PATINDEX('%Safari%',[cs(User-Agent)]) > 0 THEN 'Safari ' + REPLACE(SUBSTRING([cs(User-Agent)], PATINDEX('%Version%',[cs(User-Agent)]), PATINDEX('%Safari%',[cs(User-Agent)])- PATINDEX('%Version%',[cs(User-Agent)])),'Version/', '')
WHEN PATINDEX('%Opera%',[cs(User-Agent)]) > 0 THEN REPLACE(SUBSTRING([cs(User-Agent)], PATINDEX('%Opera%',[cs(User-Agent)]), PATINDEX('%(%',[cs(User-Agent)])-2),'/', ' ')
WHEN PATINDEX('%bot%',[cs(User-Agent)]) > 0 THEN 'bot'
ELSE 'Unknown Browser: ' + [cs(User-Agent)] END
AS Browser FROM Log
Sarathの元の投稿によると、これはFunctionでラップできます(クエリしているデータベースにそのレベルの権限がある場合)。
SQLでプログラミング関数を使用することは、これに対処するためのかなり悪い方法です。適切な方法は、おそらくブラウザ名(または別のテーブルのID)のテーブルに余分なフィールドを追加し、データベースに行を格納するたびに、そこでプログラミング言語(PHPなど)を使用して決定することです。ユーザーエージェントと保存します。そうすれば、あまり問題なく選択とグループ化を行うことができます。
将来、ブラウザの定義を変更した場合、データベース全体を一度に更新するスクリプトを実行できます。
不明なユーザーエージェントの場合、正規表現を使用して文字列からURLを抽出し、保存することができます。あなたの例ではhttp://www.facecolony.org
またはhttp://www.hairirons.org
。 URLが見つからない場合は、「不明」と入力するだけで、それらを個別に確認できます。
あなたが投稿したものは referrer spam のように疑わしく見えることに注意してください。
PHP関数 get_browser を使用しますが、このデータをアクセスログとWebサイトへのアクセスから記録する場合。 http://www.openwebanalytics.com にフックするだけです。これは、あなたがホストする素晴らしい無料のオープンソース分析プログラムです。データベーススキーマは、Wikiで利用可能です。 case
を使用してもまったく効率的ではありません。
google analytics ( 代替情報に関する情報はこちら )のような無料の分析製品を実装することを検討することをお勧めします面倒な作業をすることなく、訪問者に関するより有用で正確な情報を得ることができます。
リストするユーザーエージェントの1つだけが実際にユーザーエージェントですMozilla/4.0
は、 Internet Explorer 6 の部分的な文字列のように見えます this 説明。
他のWordPress/3.3.1
は、実際には コンテンツ管理システム です(ここに表示される理由はわかりません!)。
http://www.user-agents.org/ および http://www.useragentstring.com/ にはユーザーエージェント文字列のリストがあり、前者はxmlのダウンロードを提供しますが、それらがどれだけ最新のものかわかりません。