誰に聞いて、このページまでたどり着けたのでしょうか?
RFC2616 のヘッダフィールドの定義 で定義されているRefererヘッダを 利用するとリンク元の追跡が可能となります。
- 興味
- ログの取得
- キャッシュの活用 等のためにある。
- リンクやミスタイプ(typo)のリンクを追跡 できるようにもする。
ということなので、ここで保持した内容が、必ずしも有用な情報となるとは限らない。 また、セキュリティ上、 リンクソースがプライベートとなるような情報(イントラネットなど)、 または他のプライベート情報を拾ってしまう場合もあり得るので、 これを実装すると、公開してしまう恐れもある。
Referer | この場合は、ブラウザが語ってくれたヘッダを信じ、ここにたどり着く前に、どこで道草をしていたのか?が分かります。勝手にリンク元の追跡を行うところが TrackBack とは異なります。 |
TrackBack | 私は、貴方のページに対してリンクしていますよ!という通知に従い、その情報を保持します。Referer とは違い、明示的に通知された内容のみ保持します。また、明示的に通知します。 |
official:質問箱のリンク元の表示から、このページを 起こしました。 また、実装する上で、みなさんが、これも注意しなきゃいけないのでは?といった 懸念事項などがあれば、事前に洗い出し、実装しておきたかった。 ということにあります。
ページを表示する際に、Referer ヘッダが付いているかどうか判定して、 付いている場合には、TrackBack と同様な処理イメージで保存する。 という流れであれば、すごく簡単に実装できると考えています。
今、考えている実装だと、ページ毎に解析を行うことになりますから、 それを統合して表示したり、加工次第では、色々と解析できると考えています。
チェックを入れるのは簡単ですが、処理時間がかかります。
- 今回は、URI として正しいか?までは入れようと考えていますが、
- その URI について HEAD して、存在確認までは行わないのかなぁ?です。
Referer を管理するデータが陳腐化してきた場合の保守については、 TrackBack 同様に、保守プラグインでも別途作ってという逃げでと 考えています。なので、初期開発時は棚上げしておきます。 というのも、さほどの難易度ではないと考えておりますもので。
*COLOR 一覧表示時の表ヘッダー項目の表示色を定義する。未定義時は、デフォルトとして 以下の色が採用される。"cur"は、選択項目色。"etc"は、その他項目色。 |cur|BGCOLOR(#88ff88)| |etc|BGCOLOR(#cccccc)| *IGNORE 無視したい URI を定義する。 |http://localhost|
diff -u -b -r1.1 referer.inc.php --- plugin/referer.inc.php 3 Jul 2003 04:56:04 -0000 1.1 +++ plugin/referer.inc.php 5 Jul 2003 07:52:50 -0000 @@ -9,6 +9,34 @@ // 構成定義ファイル define('CONFIG_REFERER','plugin/referer/config'); +function plugin_referer_convert() { + global $script,$vars; + $args = func_get_args(); + + $num = is_numeric($args[0]) ? $args[0] : 0; + + $page = (is_null($args[1]) || empty($args[1])) ? $vars['page'] : $args[1]; + $r_page = rawurlencode($page); + + $file = TRACKBACK_DIR.md5(rawurlencode($page)).".ref"; + $data = tb_get($file); + usort($data, 'referer_sort_by_Counter_d'); // 2d カウンタ(大きい順) + $result = "<div class=\"referer\">リンク元 |"; + $i = 0; + foreach ($data as $x) { + if ($num != 0 && $num == $i) { + $result .= " <a href=\"$script?plugin=referer&page=$r_page\">...</a>"; + break; + } + $count = htmlspecialchars($x[2]); + $url = htmlspecialchars(rawurldecode($x[3])); // URL + $result .= "<a href=\"$url\">$count</a>|"; + $i++; + } + $result .= "</div>\n"; + return $result; +} + function plugin_referer_action() { global $script,$vars,$post,$referer; global $_referer_msg; diff -u -b -r1.26 pukiwiki.skin.ja.php --- skin/pukiwiki.skin.ja.php 2 Jul 2003 14:53:44 -0000 1.26 +++ skin/pukiwiki.skin.ja.php 5 Jul 2003 07:52:50 -0000 @@ -91,12 +91,6 @@ [ <a href="<?php echo "$script?plugin=tb&__mode=view&tb_id=$tb_id" ?>" onclick="OpenTrackback(this.href); return false">TrackBack(<?php echo tb_count($r_page) ?>)</a> ] <?php } ?> -<?php - if ($referer) { -?> - [ <a href="<?php echo "$script?plugin=referer&page=$r_page" ?>">リンク元</a> ] -<?php } ?> - </div> <?php echo $hr ?> @@ -178,6 +172,11 @@ </div> <?php } ?> +<?php +if ($referer) { + echo convert_html("#referer(20)"); +} +?> <div id="footer"> Modified by <a href="<?php echo $modifierlink ?>"><?php echo $modifier ?></a>
usort($data, 'referer_sort_by_Counter_d'); // 2d カウンタ(大きい順)なもんでしょうかね?本来、N件表示であれば、それは時系列的な流れから、素直に直近の飛来順表示かなぁ?と思います。ある時点において、リンクしてくれていたサイトが、人気サイトで、カウンタをあげてくれたとしても、そのサイトが消滅していたりすると、その表示順は、意味がなくなる日がきます。そういう考慮をすると、それは、単に、直近の飛来順なのだろうと思います。なので、私がそのロジックを組むと、デフォルトは、直近に飛んできた順(最終更新日順)でソートすると思います。-- upk 2003-07-06 (日) 18:59:59
No registered referer existsと表示している。どっちが違和感が無いでしょうかね?ということと、わざわざ、データが無いよ!と画面を遷移させるのって、どうだろう?なのです。何も遷移しないから、逆に、どういった挙動なんですか?という質問があるのも、事実とは思います。-- upk 2003-07-06 (日) 19:58:49