#author("2022-04-23T15:34:53+09:00","","") #author("2022-04-24T15:41:53+09:00","default:umorigu","umorigu") ** s.inc.php [#ubf4e745] |RIGHT:100|LEFT:360|c |~サマリ|短縮URLプラグイン ページに短いURLでアクセスできるようにする| |~リビジョン|2.0| |~対応バージョン|1.5.2| |~投稿者|[[umorigu]]| |~投稿日|&new{2011-03-10 (木) 02:46:04};| **概要 [#za7c3d33] ページにアクセス可能な、短いURLを生成するプラグインです。 #contents ***例 [#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 exist_plugin('require_once(PLUGIN_DIR . 'topicpath.inc.php'); echo plugin_topicpath_inline(); ?> </span> <?php } ?> <?php } ?> ここ↑の置き換え、または下あたりに↓を追加する。 <?php if ($is_page) { ?> <span class="small"> <?php exist_plugin('s'); 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=');%% v2.0 で廃止。PLUGIN_S_VIRTUAL_QUERY_PREFIX に置き換わりました -- %%"/?" と キーの間の文字列。mod_rewrite が使える場合は、ここで '&' などを指定する。%% - define('PLUGIN_S_VIRTUAL_QUERY_PREFIX', '?cmd=s&k='); -- "/" と キーの間の文字列。mod_rewrite が使える場合は、ここで '?&' などを指定する。 - define('PLUGIN_S_PAGENAME_MININUM_LENGTH', 20); -- 「ここの数字より短いページ名URLの場合には短縮URLを表示しない」 - define ('PLUGIN_S_SHORT_URL_ON_PERCENT', FALSE) -- TRUEの場合、オリジナルのURLに '%'が含まれていると常に短いURLを利用する。 * 仕組み [#a456e80f] - ページ名(UTF-8)のmd5ハッシュ値の文字列表現の先頭10文字(40bit分)によってページを表す。 -- キー文字列→ページ名 対応はshortener/ディレクトリに保存する。 - アクセスされたら実際のページに301リダイレクトする。 - PukiWikiがEUC-JPで動作していてもページ名はUTF-8変換して処理する。UTF-8移行前後で短縮URLを変えないため * 更新履歴 [#t642d828] - 2011/03/11 v1.0 初版 - 2021/12/02 v2.0 beta PukiWiki 1.5.2, PHP5.2 *コメント [#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}; -- version 2.0 (2021/12/02) から plugin_s_get_page_id($page) という関数で10文字のURL、 plugin_s_get_short_url_from_page($page) でURLが得られるようになりました -- [[umorigu]] &new{2022-04-23 (土) 15:34:53}; -- umoriguさま!お返事ありがとうございます。substrで文字列を抜き出す方法は思い付きませんでした。目から鱗です。参考にさせていただきます! -- [[沙紗]] &new{2018-01-24 (水) 00:53:34}; -- version 2.0 (2021/12/02) から plugin_s_get_page_id($page) という関数で10文字のpage_id、 plugin_s_get_short_url_from_page($page) でURLが得られるようになりました -- [[umorigu]] &new{2022-04-23 (土) 15:34:53}; #comment