日記
人によってパーマリンクが異なるシステム 実装例 (17:55)Edit

[Web技術][リンク] 人によってパーマリンクが異なるシステム』は一発くだらなネタのつもりだったんだけど、思いのほか反響があったんで、実際に動くサンプルを作ってみた。やっつけだけど、実際に動いた方が雰囲気が出るよね。

最初にアクセスするとCookieに発効し、それ以降はふつうにアクセスができる。各記事にもふつうにアクセスできる。けど、各記事のURLに他のブラウザとかを使ってアクセスしようとすると、目次が表示されてしまう。そこから各記事をたどる分にはふつうに表示されるけど、さっきのURLと各記事のURLは異なっている。

ソースは以下な感じ。md5値を丸ごとURLにくっつけるとうざいんで、最初の3文字だけに削った。それでも4096通りあるんでパーマリンクがパーマリンクとして働かないという用途では十分だよね。

<?php
mb_internal_encoding('euc-jp');
header('content-type: text/html; charset=euc-jp');
main();
function main()
{
$uid = getUserId();
if (!$uid) {
publishUserId();
die;
}
if (isset($_GET['entry'])) {
$entry = $_GET['entry'];
if ($entry = checkEntryLink($entry)) {
showEntry($entry);
die;
}
}
showEntryList();
}
function showEntry($entry)
{
$item = getEntry($entry);
echo '<h1><a href="' . makeEntryLink($entry) . '">' . htmlspecialchars($item['title']) . '</a></h1>';
echo '<p>' . nl2br(htmlspecialchars($item['body'])) . '</p>';
}
function getUserId()
{
if (isset($_COOKIE['uid'])) {
return $_COOKIE['uid'];
}
}
function publishUserId()
{
setcookie('uid', md5(uniqid(rand(),1)), time() + 60 * 60 * 24 * 30);
echo 'Cookieを発効しました。';
echo '<a href="?">記事一覧へ</a>';
}
function checkEntryLink($link)
{
list($entry, $check) = explode('_', $link);
$uid = getUserId();
if ($check == makeCheckSum($entry, $uid)) {return intval($entry);}
return FALSE;
}
function makeEntryLink($entry)
{
$uid = getUserId();
$link = '?entry=' . $entry . '_' . makeCheckSum($entry, $uid);
return $link;
}
function makeCheckSum($entry, $uid)
{
return substr(md5($entry . $uid), 0, 3);
}
function showEntryList()
{
$list = getEntry();
echo '<ul>';
foreach ($list as $entry => $item) {
echo '<li><a href="' . htmlspecialchars(makeEntryLink($entry)) . '">' . htmlspecialchars($item['title']) . '</a></li>';
}
echo '</ul>';
}
function getEntry($entry = NULL)
{
$entrylist = array(
'1' => array(
'title' => 'うへ',
'body' => 'まあそんなこともあるさ。',
),
'2' => array(
'title' => 'うほ',
'body' => 'えー、マジっすかー。',
),
'3' => array(
'title' => 'うげ',
'body' => 'そうなんですよ。',
),
);
if (!isset($entry)) {
return $entrylist;
}
if (isset($entrylist[$entry])) {
return $entrylist[$entry];
}
}
?>

Published At2005-07-12 00:00Updated At2005-07-12 00:00