#author("2018-12-18T23:14:55+09:00","","")
#author("2018-12-18T23:15:43+09:00","","")
** s.inc.php [#ubf4e745]
|RIGHT:100|LEFT:360|c
|~サマリ|短縮URLプラグイン ページに短いURLでアクセスできるようにする|
|~リビジョン|1.0|
|~対応バージョン|1.4.7|
|~投稿者|[[umorigu]]|
|~投稿日|&new{2011-03-10 (木) 02:46:04};|

**概要 [#za7c3d33]
ページにアクセス可能な、短いURLを生成するプラグインです。

***例 [#gfaff917]

 「長い名前を持つページ」
 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
にまで短くなります。

**セットアップ [#gd9902d8]

*** s.inc.php配置 [#pb2b5443]
- https://github.com/umorigu/pukiwiki.urlshortener から s.inc.php をダウンロードする。
- s.inc.php を plugin/ ディレクトリに配置する。
*** ディレクトリ作成 [#kcb2f5ed]
wiki/ や plugin/ と並列の位置に次の2つのディレクトリを作成する。
- shortener/
- shortener_counter/

パーミッションの設定

 chmod -R 777 shortener shortener_counter

*** skin/pukiwiki.skin.php を編集 [#xf0bc721]

 <?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を併用する場合 [#w7c55b90]
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 形式でアクセスできるようになる。


* 設定値 [#ie404457]

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を表示しない」

* 仕組み [#a456e80f]

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



**コメント [#j0cb2912]
- ソースを見ただけでほとんどテストをしてませんが、ツッコミを入れておいた方がいいのかな? --  &new{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ハッシュ処理などをしている。[[添付ファイルの問題>Q&A/プラグイン/attachプラグイン#dc6fc1c4]]ほど実行回数が多くないのでまだましかもしれませんが(添付ファイルの数だけと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]] &new{2011-03-10 (木) 22:01:15};
- 関連: [[欲しいプラグイン/98]] --  &new{2011-04-26 (火) 19:48:07};
- お詳しい方がいらっしゃいましたら教えて下さい。このプラグインにて短縮されたURLの文字列を、リンクタグ無しで変数等に格納して取得したいのですが、いい方法やサンプルコード等ございますでしょうか。説明文のpukiwiki.skin.phpの編集ですと、リンク付きのURLがページに表示されます。単純な文字列としての短縮URLを別途php内で扱いたいのです。どうぞ宜しくお願いします。 -- [[沙紗]] &new{2018-01-22 (月) 19:37:39};
-- 確かに、URLだけ取得する関数をつけておけばよかったですね。とりあえず同じロジックを実装するならページ名$page に対して substr(md5($page, 0, PLUGIN_S_PAGEID_LENGTH) で10文字のkeyが得られます -- [[umorigu]] &new{2018-01-22 (月) 21:30:17};
- umoriguさま!お返事ありがとうございます。substrで文字列を抜き出す方法は思い付きませんでした。目から鱗です。参考にさせていただきます! -- [[沙紗]] &new{2018-01-24 (水) 00:53:34};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.3+ © 2001-2020 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u12. HTML convert time: 0.069 sec.

OSDN