s.inc.php

サマリ短縮URLプラグイン ページに短いURLでアクセスできるようにする
リビジョン1.0
対応バージョン1.4.7
投稿者umorigu
投稿日2011-03-10 (木) 02:46:04

概要

ページにアクセス可能な、短いURLを生成するプラグインです。

「長い名前を持つページ」
www.example.com/pukiwiki/?%E9%95%B7%E3%81%84%E5%90%8D%E5%89%8D%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8

に対して、

www.example.com/pukiwiki/?cmd=s&k=2dc9e012b6

というURLでアクセスできるようにします(k=の後は10文字(設定値))。 実際にはオリジナルのページへ302(301)リダイレクトされます。

mod_rewriteを併用することで

www.example.com/pukiwiki/?&2dc9e012b6

にまで短くなります。

セットアップ

s.inc.php配置

  • https://github.com/umorigu/pukiwiki.urlshortener から s.inc.php をダウンロードする。
  • s.inc.php を plugin/ ディレクトリに配置する。

ディレクトリ作成

wiki/ や plugin/ と並列の位置に次の2つのディレクトリを作成する。

  • shortener/
  • shortener_counter/

パーミッションの設定

chmod -R 777 shortener shortener_counter

skin/pukiwiki.skin.php を編集

<?php if ($is_page) { ?>
 <?php if(SKIN_DEFAULT_DISABLE_TOPICPATH) { ?>
   <a href="<?php echo $link['reload'] ?>"><span class="small"><?php echo $link['reload'] ?></span></a>
 <?php } else { ?>
   <span class="small">
   <?php require_once(PLUGIN_DIR . 'topicpath.inc.php'); echo plugin_topicpath_inline(); ?>
   </span>
 <?php } ?>
<?php } ?>

ここ↑の置き換え、または下あたりに↓を追加する。

<?php if ($is_page) { ?>
 <br>
 <span class="small">
 <?php require_once(PLUGIN_DIR . 's.inc.php'); echo plugin_s_convert_get_short_link(); ?>
 </span>
<?php } ?>

実際はどこか1箇所に書けばよい。

mod_rewriteを併用する場合

mod_rewrite用の.htaccessの例

RewriteEngine on
RewriteBase /var/www/html/pukiwiki
RewriteCond %{QUERY_STRING} ^&([0-9a-f]+)$
RewriteRule ^(.*)$ /pukiwiki/?cmd=s&k=%1

これで、

www.example.com/pukiwiki/?&2dc9e012b6

のような /?&xxxxxxxxxx 形式でアクセスできるようになる。

設定値

s.inc.php で設定する。

  • define('PLUGIN_S_PAGEID_LENGTH', 10);
    • ページを表すキーを何文字にするか。最大32文字
  • define('PLUGIN_S_COMMAND_STR', 'cmd=s&k=');
    • "/?" と キーの間の文字列。mod_rewrite が使える場合は、ここで '&' などを指定する。
  • define('PLUGIN_S_PAGENAME_MININUM_LENGTH', 20);
    • 「ここの数字より短いページ名URLの場合には短縮URLを表示しない」

仕組み

  • ページ名(UTF-8)のmd5ハッシュ値の文字列表現の先頭10文字(40bit分)によってページを表す。
    • キー文字列→ページ名 対応はshortener/ディレクトリに保存する。
  • アクセスされたら実際のページに301リダイレクトする。
  • PukiWikiがEUC-JPで動作していてもページ名はUTF-8変換して処理する。UTF-8移行前後で短縮URLを変えないため。

コメント

  • ソースを見ただけでほとんどテストをしてませんが、ツッコミを入れておいた方がいいのかな? -- 2011-03-10 (木) 13:04:30
    • plugin_s_inline_get_short_url関数で、
      	if (is_page($page) &&
      		PLUGIN_S_PAGENAME_MININUM_LENGTH < strlen(rawurlencode($page)))
      の分岐がFalseになった場合は使われないにもかかわらず、必ずmd5ハッシュ処理などをしている。添付ファイルの問題ほど実行回数が多くないのでまだましかもしれませんが(添付ファイルの数だけと1回だけ)
    • plugin_s_inline_get_short_url関数で、PKWK_UTF8_ENABLE定数まわりの処理が少し無駄かもしれません。例えば
      	if (defined('PKWK_UTF8_ENABLE'))
      	{
      		$utf8page = $page;
      	}
      	else
      	{
      		$utf8page = mb_convert_encoding(mb_convert_encoding($page, 'SJIS-win', 'EUC-JP'), 'UTF-8', 'SJIS-win');
      	}
      	$encoded = encode($utf8page);
      としてしまえばencode関数の実行が必ず1回で済みますし、key-name mapを記録する場合でも$utf8pageを使えば分岐なしにできると思います。ついでに、2回目の文字コード変換も消せるかなと。
  • コメントありがとうございます。ご指摘のとおり無駄な処理でしたので、参考にして整理しました。すっきりしました:-) -- umorigu 2011-03-10 (木) 22:01:15
  • 関連: 欲しいプラグイン/98 -- 2011-04-26 (火) 19:48:07
  • お詳しい方がいらっしゃいましたら教えて下さい。このプラグインにて短縮されたURLの文字列を、リンクタグ無しで変数等に格納して取得したいのですが、いい方法やサンプルコード等ございますでしょうか。説明文のpukiwiki.skin.phpの編集ですと、リンク付きのURLがページに表示されます。単純な文字列としての短縮URLを別途php内で扱いたいのです。どうぞ宜しくお願いします。 -- 沙紗? 2018-01-22 (月) 19:37:39
    • 確かに、URLだけ取得する関数をつけておけばよかったですね。とりあえず同じロジックを実装するならページ名$page に対して substr(md5($page, 0, PLUGIN_S_PAGEID_LENGTH) で10文字のkeyが得られます -- umorigu 2018-01-22 (月) 21:30:17
  • umoriguさま!お返事ありがとうございます。substrで文字列を抜き出す方法は思い付きませんでした。目から鱗です。参考にさせていただきます! -- 沙紗? 2018-01-24 (水) 00:53:34


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-12-18 (火) 23:15:44
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u6. HTML convert time: 0.229 sec.

OSDN