BugTrack/2525
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
* URLカスタマイズの仕組み [#t65b6b10]
- ページ: [[BugTrack]]
- 投稿者: [[umorigu]]
- 優先順位: 低
- 状態: 完了
- カテゴリー: 本体新機能
- 投稿日: 2021-11-27 (土) 18:12:19
- バージョン: 1.5.3
- リリース予定バージョン: 1.5.4
#contents
** メッセージ [#p2d503a3]
PukiWiki の定番のカスタマイズとして、ページURLを変えるも...
URL (path, query 部分) の例
「階層1/名前」というページの場合
- /?%E9%9A%8E%E5%B1%A41/%E5%90%8D%E5%89%8D (標準)
-- 最近のブラウザではアドレス欄でURL decodeされて 「/?階...
- /%E9%9A%8E%E5%B1%A41/%E5%90%8D%E5%89%8D (Path (サーバ...
- /%E9%9A%8E%E5%B1%A41/%E5%90%8D%E5%89%8D.html (さらに...
- /?&a66dc2fa8e (短縮URLプラグイン [[official:Plugins/s.i...
-- 短縮URLは通常URLにリダイレクトするパターンと、直接表示...
- /?a66dc2fa8e (短縮URLプラグイン [[official:Plugins/s.in...
-- 短縮部分に "?" をつけない形 (通常ページ名と区別がつか...
- /a66dc2fa8e (短縮URLをさらにpath風に見せる)
- /123.html (pgid プラグイン利用?)
※このページで利用されている 短縮URLプラグイン ([[s.inc.ph...
このURLカスタマイズを利用したい場合に個別に導入してくださ...
カスタマイズ例:
| カスタマイズ | 説明 | ページURL例 | アドレス欄表示 | 備...
| (1) 標準 | '?' の後にページ名 | https://pukiwiki.os...
| (2) 末尾 .html | '?' の後にページ名。末尾が .html | htt...
| (3) path風に変更 | '?' がなく、サーバー上のファイル名の...
| (6) 短縮URLベース | 長いURLのページを短縮URLプラグイン...
| (7) 短縮URLリダイレクト | 短縮URLプラグインにより、短縮...
| (8) 短縮URL優先 | 短縮URLプラグインにより、ページ名URL→...
| (9) 短縮URLベース2 | 長いURLのページを短縮URLプラグイン...
** 実動作サンプル [#samples]
*** (1) 通常 [#nf0c7789]
- https://pukiwiki.osdn.jp/_samples/1/
-- https://pukiwiki.osdn.jp/_samples/1/?%E9%9A%8E%E5%...
--- アドレス欄 「/?階層1/名前」
*** (2) 末尾 (ページ名).html [#d77d4243]
- https://pukiwiki.osdn.jp/_samples/2/
-- https://pukiwiki.osdn.jp/_samples/2/?%E9%9A%8E%E5%...
--- アドレス欄 「/?階層1/名前.html」
pukiwiki.ini.php
// Page-URI mapping handler ( See https:// pukiwiki.osdn...
class HtmlSuffixPageURIHandler extends PukiWikiStandardP...
function get_page_uri_virtual_query($page) {
return '?' . pagename_urlencode($page) . '.html';
}
function get_page_from_query_string($query_string) {
$param1st = preg_replace("#^([^&]*)&.*$#", "$1", $query...
if ($param1st == '') {
return null; // default page
}
if (strpos($param1st, '=') !== FALSE) {
// Found '/?key=value' (NG chars)
return FALSE; // Error page
}
$base = preg_replace('#\.html$#', '', $param1st);
if ($param1st === $base) {
return FALSE; // Error
}
$page = urldecode($base);
$page2 = input_filter($page);
if ($page !== $page2) {
return FALSE; // Error page
}
return $page2;
}
}
$page_uri_handler = new HtmlSuffixPageURIHandler();
*** (3) ページ名を path に見せる [#u315499d]
ページ名の前に '?' がつかず、ページがそのままサーバー上の...
- https://pukiwiki.osdn.jp/_samples/3/
-- https://pukiwiki.osdn.jp/_samples/3/%E9%9A%8E%E5%B...
--- アドレス欄 「/階層1/名前」
pukiwiki.ini.php:
image ディレクトリ
define('IMAGE_DIR', '/_samples/3/image/');
トップページの絶対URL
$script = 'https:// pukiwiki.osdn.jp/_samples/3/';
パスのカスタマイズ ('?' をつけない)
各ページで相対パスでなくルート相対パスを利用するために pk...
// Page-URI mapping handler ( See https:// pukiwiki.osdn...
class VirtualPathPageURIHandler extends PukiWikiStandard...
function get_page_uri_virtual_query($page) {
return pagename_urlencode($page);
}
}
pkwk_base_uri_type_stack_push(PKWK_URI_ROOT);
$page_uri_handler = new VirtualPathPageURIHandler();
.htaccess
このカスタマイズはPHPだけでは実現できず、Webサーバー側で...
RewriteEngine On
RewriteCond %{REQUEST_URI} !(^/_samples/3/$)
RewriteCond %{REQUEST_URI} !(^/_samples/3/image/)
RewriteCond %{REQUEST_URI} !(^/_samples/3/skin/)
RewriteCond %{REQUEST_FILENAME} !(\.php$)
RewriteRule ^(.+)$ /_samples/3/?$1 [L]
意味: path が /, /image/..., /skin/... 以外の場合は /?{pa...
この設定の場合、"image/" と "skin/" で始まるページ名、末...
/skin/pukiwiki.skin.php:
スキンファイルもいくつか、参照ファイルをルート相対パスで...
<link rel="stylesheet" type="text/css" href="/_samples/3...
<script type="text/javascript" src="/_samples/3/skin/mai...
<script type="text/javascript" src="/_samples/3/skin/sea...
<a href="<?php echo $link['top'] ?>"><img id="logo" src...
echo '<a href="' . $link[$key] . '">' .
'<img src="/_samples/3/' . IMAGE_DIR . $i...
'alt="' . $lang[$key] . '" title=...
'</a>';
/pukiwiki.ini.php:
Base URLを固定で指定する。
$script = 'https://pukiwiki.osdn.jp/_sample/3/'
*** (6) 短縮URLプラグイン ([[s.inc.php>official:Plugins/s...
- https://pukiwiki.osdn.jp/_samples/6/
-- https://pukiwiki.osdn.jp/_samples/6/?&a66dc2fa8e
--- (リダイレクト無し)
--- アドレス欄 「/?&a66dc2fa8e」
pukiwiki.ini.php:
// Page-URI mapping handler ( See https:// pukiwiki.osdn...
class ShortUrlPageURIHandler extends PukiWikiStandardPag...
function get_page_uri_virtual_query($page) {
exist_plugin('s'); // Load s.inc.php
$page_id = plugin_s_get_page_id($page);
if ($page_id) {
return '?&' . $page_id;
}
return '?' . pagename_urlencode($page);
}
function get_page_from_query_string($query_string) {
exist_plugin('s'); // Load s.inc.php
$m = array();
if (preg_match('#^\&([0-9a-f]{10})$#', $query_string, $...
$page = plugin_s_get_page_from_page_id($m[1]);
return $page;
}
return parent::get_page_from_query_string($query_string);
}
}
$page_uri_handler = new ShortUrlPageURIHandler();
注意: ページURLを取得するのにファイル生成またはファイル存...
*** (7) 短縮URLプラグイン ([[s.inc.php>official:Plugins/s...
主に通常ページ名URLを使い、短縮URLでのリンクも可能にする...
- https://pukiwiki.osdn.jp/_samples/7/
-- https://pukiwiki.osdn.jp/_samples/7/?&a66dc2fa8e
--- https://pukiwiki.osdn.jp/_samples/7/?%E9%9A%8E%E5...
--- アドレス欄 「/?階層1/名前」
pukiwiki.ini.php:
// Page-URI mapping handler ( See https:// pukiwiki.osdn...
class ShortUrlRedirectPageURIHandler extends PukiWikiSta...
function filter_raw_query_string($query_string) {
$m = array();
if (preg_match('#^\&([0-9a-f]{10})$#', $query_string, $...
return 'cmd=s&k=' . $m[1];
}
return $query_string;
}
}
$page_uri_handler = new ShortUrlRedirectPageURIHandler();
タイトル下に以下のコードを挿入する。 ([[official:Plugins/...
<?php if ($is_page) { ?>
<span class="small">
<?php exist_plugin('s'); echo plugin_s_convert_get_shor...
</span>
<?php } ?>
*** (8) 短縮URLプラグイン ([[s.inc.php>official:Plugins/s...
- https://pukiwiki.osdn.jp/_samples/8/
-- https://pukiwiki.osdn.jp/_samples/8/?&a66dc2fa8e
--- そのまま表示
-- https://pukiwiki.osdn.jp/_samples/8/?%E9%9A%8E%E5%...
--- https://pukiwiki.osdn.jp/_samples/8/?&a66dc2fa8e ...
--- アドレス欄 「/?&a66dc2fa8e」
pukiwiki.ini.php:
// Page-URI mapping handler ( See https:// pukiwiki.osdn...
class ShortUrlPrimaryPageURIHandler extends PukiWikiStan...
function get_page_uri_virtual_query($page) {
exist_plugin('s'); // Load s.inc.php
$page_id = plugin_s_get_page_id($page);
if ($page_id) {
return '?&' . $page_id;
}
return '?' . pagename_urlencode($page);
}
function get_page_from_query_string($query_string) {
exist_plugin('s'); // Load s.inc.php
$m = array();
if (preg_match('#^\&([0-9a-f]{10})$#', $query_string, $...
$page = plugin_s_get_page_from_page_id($m[1]);
return $page;
}
$is_get = $_SERVER['REQUEST_METHOD'] === 'GET';
if ($is_get) {
if (strpos('&', $query_string) !== NULL) {
$dec_page = urldecode($query_string);
$page_id = plugin_s_get_page_id($dec_page);
if ($page_id) {
$short_url = get_page_uri($dec_page, PKWK_URI_ROOT);
header("HTTP/1.1 302 Found");
header("Location: $short_url");
exit;
}
}
}
return parent::get_page_from_query_string($query_string);
}
}
$page_uri_handler = new ShortUrlPrimaryPageURIHandler();
*** (9) 短縮URLプラグイン ([[s.inc.php>official:Plugins/s...
- https://pukiwiki.osdn.jp/_samples/9/
-- https://pukiwiki.osdn.jp/_samples/9/?a66dc2fa8e
--- (リダイレクト無し)
--- アドレス欄 「/?a66dc2fa8e」
"?" の後に "&" 等の記号なしに短縮URL用の page_id を続ける...
URLはシンプルになるが、指定されているのがページ名なのか短...
例: "/?aaaaaaaaaa" というURLの場合に「"aaaaaaaa"というペ...
このカスタマイズ例では、英数小文字が10文字続いた場合には...
「英数小文字10文字」はすべて短縮URLとみなし、この形の名前...
pukiwiki.ini.php:
class ShortUrl2PageURIHandler extends PukiWikiStandardPa...
function get_page_uri_virtual_query($page) {
exist_plugin('s'); // Load s.inc.php
$page_id = plugin_s_get_page_id($page);
if ($page_id) {
return '?' . $page_id;
}
return '?' . pagename_urlencode($page);
}
function get_page_from_query_string($query_string) {
exist_plugin('s'); // Load s.inc.php
$m = array();
if (preg_match('#^([0-9a-z]{10})$#', $query_string, $m)...
$page = plugin_s_get_page_from_page_id($m[1]);
if ($page) {
return $page;
} else {
// Not found
http_response_code(404);
die_message('Not found');
exit;
}
}
return parent::get_page_from_query_string($query_string);
}
}
$page_uri_handler = new ShortUrl2PageURIHandler();
** URLカスタマイズの2パターン [#f92aa1c1]
表示に関わる
- (a) PHPのみで実現できるもの
-- "?" を使って、PHPファイルとクエリパラメータを分けてい...
- (b) Apache/nginxなど、WebサーバーでのURLマッピング操作...
-- "?" を使わず、PHPファイルのURLと本来クエリパラメータと...
** 参照 [#q540935c]
- [[BugTrack/2213]] get_page_uri($page) 関数
- [[official:Plugins/s.inc.php]]
** 対象 [#d873298b]
- ページの表示 (readプラグインのaction)
- read以外のactionのURLは対象外 (標準のまま)
** 設計 [#f5b72059]
- 各ページのURLを作成しているのは get_page_uri($page) で...
- 各種プラグインも get_page_uri($page) によって各ページの...
-- get_page_uri() ができたのが PukiWiki 1.5.2 (2019年3月...
クラス
class PukiWikiStandardPageURIHandler {
// QueryStringの変換
function filter_raw_query_string($query_string);
// ページ名からURIのページ表現部分を生成
function get_page_uri_fragment($page);
// クエリストリングからページ名を取得
function get_page_from_query_string($query_string);
}
lib/init.php:397
// cmdもpluginも指定されていない場合は、QUERY_STRINGをペ...
if (! isset($vars['cmd']) && ! isset($vars['plugin'])) {
$get['cmd'] = $post['cmd'] = $vars['cmd'] = 'read';
$arg = preg_replace("#^([^&]*)&.*$#", "$1", $arg);
if ($arg == '') $arg = $defaultpage;
if (strpos($arg, '=') !== false) $arg = $defaultpage; /...
$arg = urldecode($arg);
$arg = strip_bracket($arg);
$arg = input_filter($arg);
$get['page'] = $post['page'] = $vars['page'] = $arg;
}
** 対応していないプラグインへの対応 [#unsuppoeted_plugins]
各ページへのリンクURL取得手段として PukiWiki 1.5.2 から導...
ページURLに get_page_uri($page) を利用するよう書き換えて...
** カスタマイズ内容 [#hc888a0e]
(URL生成)
各ページのURL は get_base_uri() + 「ページを表すURL片」で...
ページ名を引数にしてこの「ページを表すURL片」の生成する関...
(ページの表示)
「ページを表すURL片」を受け取って、表示(または別のプラグ...
** 既存ロジック不明なところ [#ze114a2e]
make_link.php
クラス Link_interwikiname - function set()
$url = get_interwiki_url($name, $this->param);
$this->url = ($url === FALSE) ?
get_base_uri() . '?' . pagename_urlencode('[[' . $name...
htmlsc($url);
? に続けて [[ name : param ]] を設定しているがこの記述で ...
--------
- 試作してみました。まだ取り込まず、試行錯誤の段階です --...
- 対応しました。 1.5.4 のリリースに含めます。 commit:1dd...
- URLの https://pukiwiki.osdn.jp/_samples/7/?%E9%9A%8...
-- 作れます。少しお待ちを -- [[umorigu]] &new{2022-01-10 ...
-- この先日話していた「通常URLを短縮URLの方へリダイレクト...
-- 「(8) 短縮URLプラグイン ([[s.inc.php>official:Plugins/...
- 窓の杜では 本体へ手を加えることなく実現 なんて紹介さ...
-- 窓の杜の記事は https://forest.watch.impress.co.jp/...
#comment
終了行:
* URLカスタマイズの仕組み [#t65b6b10]
- ページ: [[BugTrack]]
- 投稿者: [[umorigu]]
- 優先順位: 低
- 状態: 完了
- カテゴリー: 本体新機能
- 投稿日: 2021-11-27 (土) 18:12:19
- バージョン: 1.5.3
- リリース予定バージョン: 1.5.4
#contents
** メッセージ [#p2d503a3]
PukiWiki の定番のカスタマイズとして、ページURLを変えるも...
URL (path, query 部分) の例
「階層1/名前」というページの場合
- /?%E9%9A%8E%E5%B1%A41/%E5%90%8D%E5%89%8D (標準)
-- 最近のブラウザではアドレス欄でURL decodeされて 「/?階...
- /%E9%9A%8E%E5%B1%A41/%E5%90%8D%E5%89%8D (Path (サーバ...
- /%E9%9A%8E%E5%B1%A41/%E5%90%8D%E5%89%8D.html (さらに...
- /?&a66dc2fa8e (短縮URLプラグイン [[official:Plugins/s.i...
-- 短縮URLは通常URLにリダイレクトするパターンと、直接表示...
- /?a66dc2fa8e (短縮URLプラグイン [[official:Plugins/s.in...
-- 短縮部分に "?" をつけない形 (通常ページ名と区別がつか...
- /a66dc2fa8e (短縮URLをさらにpath風に見せる)
- /123.html (pgid プラグイン利用?)
※このページで利用されている 短縮URLプラグイン ([[s.inc.ph...
このURLカスタマイズを利用したい場合に個別に導入してくださ...
カスタマイズ例:
| カスタマイズ | 説明 | ページURL例 | アドレス欄表示 | 備...
| (1) 標準 | '?' の後にページ名 | https://pukiwiki.os...
| (2) 末尾 .html | '?' の後にページ名。末尾が .html | htt...
| (3) path風に変更 | '?' がなく、サーバー上のファイル名の...
| (6) 短縮URLベース | 長いURLのページを短縮URLプラグイン...
| (7) 短縮URLリダイレクト | 短縮URLプラグインにより、短縮...
| (8) 短縮URL優先 | 短縮URLプラグインにより、ページ名URL→...
| (9) 短縮URLベース2 | 長いURLのページを短縮URLプラグイン...
** 実動作サンプル [#samples]
*** (1) 通常 [#nf0c7789]
- https://pukiwiki.osdn.jp/_samples/1/
-- https://pukiwiki.osdn.jp/_samples/1/?%E9%9A%8E%E5%...
--- アドレス欄 「/?階層1/名前」
*** (2) 末尾 (ページ名).html [#d77d4243]
- https://pukiwiki.osdn.jp/_samples/2/
-- https://pukiwiki.osdn.jp/_samples/2/?%E9%9A%8E%E5%...
--- アドレス欄 「/?階層1/名前.html」
pukiwiki.ini.php
// Page-URI mapping handler ( See https:// pukiwiki.osdn...
class HtmlSuffixPageURIHandler extends PukiWikiStandardP...
function get_page_uri_virtual_query($page) {
return '?' . pagename_urlencode($page) . '.html';
}
function get_page_from_query_string($query_string) {
$param1st = preg_replace("#^([^&]*)&.*$#", "$1", $query...
if ($param1st == '') {
return null; // default page
}
if (strpos($param1st, '=') !== FALSE) {
// Found '/?key=value' (NG chars)
return FALSE; // Error page
}
$base = preg_replace('#\.html$#', '', $param1st);
if ($param1st === $base) {
return FALSE; // Error
}
$page = urldecode($base);
$page2 = input_filter($page);
if ($page !== $page2) {
return FALSE; // Error page
}
return $page2;
}
}
$page_uri_handler = new HtmlSuffixPageURIHandler();
*** (3) ページ名を path に見せる [#u315499d]
ページ名の前に '?' がつかず、ページがそのままサーバー上の...
- https://pukiwiki.osdn.jp/_samples/3/
-- https://pukiwiki.osdn.jp/_samples/3/%E9%9A%8E%E5%B...
--- アドレス欄 「/階層1/名前」
pukiwiki.ini.php:
image ディレクトリ
define('IMAGE_DIR', '/_samples/3/image/');
トップページの絶対URL
$script = 'https:// pukiwiki.osdn.jp/_samples/3/';
パスのカスタマイズ ('?' をつけない)
各ページで相対パスでなくルート相対パスを利用するために pk...
// Page-URI mapping handler ( See https:// pukiwiki.osdn...
class VirtualPathPageURIHandler extends PukiWikiStandard...
function get_page_uri_virtual_query($page) {
return pagename_urlencode($page);
}
}
pkwk_base_uri_type_stack_push(PKWK_URI_ROOT);
$page_uri_handler = new VirtualPathPageURIHandler();
.htaccess
このカスタマイズはPHPだけでは実現できず、Webサーバー側で...
RewriteEngine On
RewriteCond %{REQUEST_URI} !(^/_samples/3/$)
RewriteCond %{REQUEST_URI} !(^/_samples/3/image/)
RewriteCond %{REQUEST_URI} !(^/_samples/3/skin/)
RewriteCond %{REQUEST_FILENAME} !(\.php$)
RewriteRule ^(.+)$ /_samples/3/?$1 [L]
意味: path が /, /image/..., /skin/... 以外の場合は /?{pa...
この設定の場合、"image/" と "skin/" で始まるページ名、末...
/skin/pukiwiki.skin.php:
スキンファイルもいくつか、参照ファイルをルート相対パスで...
<link rel="stylesheet" type="text/css" href="/_samples/3...
<script type="text/javascript" src="/_samples/3/skin/mai...
<script type="text/javascript" src="/_samples/3/skin/sea...
<a href="<?php echo $link['top'] ?>"><img id="logo" src...
echo '<a href="' . $link[$key] . '">' .
'<img src="/_samples/3/' . IMAGE_DIR . $i...
'alt="' . $lang[$key] . '" title=...
'</a>';
/pukiwiki.ini.php:
Base URLを固定で指定する。
$script = 'https://pukiwiki.osdn.jp/_sample/3/'
*** (6) 短縮URLプラグイン ([[s.inc.php>official:Plugins/s...
- https://pukiwiki.osdn.jp/_samples/6/
-- https://pukiwiki.osdn.jp/_samples/6/?&a66dc2fa8e
--- (リダイレクト無し)
--- アドレス欄 「/?&a66dc2fa8e」
pukiwiki.ini.php:
// Page-URI mapping handler ( See https:// pukiwiki.osdn...
class ShortUrlPageURIHandler extends PukiWikiStandardPag...
function get_page_uri_virtual_query($page) {
exist_plugin('s'); // Load s.inc.php
$page_id = plugin_s_get_page_id($page);
if ($page_id) {
return '?&' . $page_id;
}
return '?' . pagename_urlencode($page);
}
function get_page_from_query_string($query_string) {
exist_plugin('s'); // Load s.inc.php
$m = array();
if (preg_match('#^\&([0-9a-f]{10})$#', $query_string, $...
$page = plugin_s_get_page_from_page_id($m[1]);
return $page;
}
return parent::get_page_from_query_string($query_string);
}
}
$page_uri_handler = new ShortUrlPageURIHandler();
注意: ページURLを取得するのにファイル生成またはファイル存...
*** (7) 短縮URLプラグイン ([[s.inc.php>official:Plugins/s...
主に通常ページ名URLを使い、短縮URLでのリンクも可能にする...
- https://pukiwiki.osdn.jp/_samples/7/
-- https://pukiwiki.osdn.jp/_samples/7/?&a66dc2fa8e
--- https://pukiwiki.osdn.jp/_samples/7/?%E9%9A%8E%E5...
--- アドレス欄 「/?階層1/名前」
pukiwiki.ini.php:
// Page-URI mapping handler ( See https:// pukiwiki.osdn...
class ShortUrlRedirectPageURIHandler extends PukiWikiSta...
function filter_raw_query_string($query_string) {
$m = array();
if (preg_match('#^\&([0-9a-f]{10})$#', $query_string, $...
return 'cmd=s&k=' . $m[1];
}
return $query_string;
}
}
$page_uri_handler = new ShortUrlRedirectPageURIHandler();
タイトル下に以下のコードを挿入する。 ([[official:Plugins/...
<?php if ($is_page) { ?>
<span class="small">
<?php exist_plugin('s'); echo plugin_s_convert_get_shor...
</span>
<?php } ?>
*** (8) 短縮URLプラグイン ([[s.inc.php>official:Plugins/s...
- https://pukiwiki.osdn.jp/_samples/8/
-- https://pukiwiki.osdn.jp/_samples/8/?&a66dc2fa8e
--- そのまま表示
-- https://pukiwiki.osdn.jp/_samples/8/?%E9%9A%8E%E5%...
--- https://pukiwiki.osdn.jp/_samples/8/?&a66dc2fa8e ...
--- アドレス欄 「/?&a66dc2fa8e」
pukiwiki.ini.php:
// Page-URI mapping handler ( See https:// pukiwiki.osdn...
class ShortUrlPrimaryPageURIHandler extends PukiWikiStan...
function get_page_uri_virtual_query($page) {
exist_plugin('s'); // Load s.inc.php
$page_id = plugin_s_get_page_id($page);
if ($page_id) {
return '?&' . $page_id;
}
return '?' . pagename_urlencode($page);
}
function get_page_from_query_string($query_string) {
exist_plugin('s'); // Load s.inc.php
$m = array();
if (preg_match('#^\&([0-9a-f]{10})$#', $query_string, $...
$page = plugin_s_get_page_from_page_id($m[1]);
return $page;
}
$is_get = $_SERVER['REQUEST_METHOD'] === 'GET';
if ($is_get) {
if (strpos('&', $query_string) !== NULL) {
$dec_page = urldecode($query_string);
$page_id = plugin_s_get_page_id($dec_page);
if ($page_id) {
$short_url = get_page_uri($dec_page, PKWK_URI_ROOT);
header("HTTP/1.1 302 Found");
header("Location: $short_url");
exit;
}
}
}
return parent::get_page_from_query_string($query_string);
}
}
$page_uri_handler = new ShortUrlPrimaryPageURIHandler();
*** (9) 短縮URLプラグイン ([[s.inc.php>official:Plugins/s...
- https://pukiwiki.osdn.jp/_samples/9/
-- https://pukiwiki.osdn.jp/_samples/9/?a66dc2fa8e
--- (リダイレクト無し)
--- アドレス欄 「/?a66dc2fa8e」
"?" の後に "&" 等の記号なしに短縮URL用の page_id を続ける...
URLはシンプルになるが、指定されているのがページ名なのか短...
例: "/?aaaaaaaaaa" というURLの場合に「"aaaaaaaa"というペ...
このカスタマイズ例では、英数小文字が10文字続いた場合には...
「英数小文字10文字」はすべて短縮URLとみなし、この形の名前...
pukiwiki.ini.php:
class ShortUrl2PageURIHandler extends PukiWikiStandardPa...
function get_page_uri_virtual_query($page) {
exist_plugin('s'); // Load s.inc.php
$page_id = plugin_s_get_page_id($page);
if ($page_id) {
return '?' . $page_id;
}
return '?' . pagename_urlencode($page);
}
function get_page_from_query_string($query_string) {
exist_plugin('s'); // Load s.inc.php
$m = array();
if (preg_match('#^([0-9a-z]{10})$#', $query_string, $m)...
$page = plugin_s_get_page_from_page_id($m[1]);
if ($page) {
return $page;
} else {
// Not found
http_response_code(404);
die_message('Not found');
exit;
}
}
return parent::get_page_from_query_string($query_string);
}
}
$page_uri_handler = new ShortUrl2PageURIHandler();
** URLカスタマイズの2パターン [#f92aa1c1]
表示に関わる
- (a) PHPのみで実現できるもの
-- "?" を使って、PHPファイルとクエリパラメータを分けてい...
- (b) Apache/nginxなど、WebサーバーでのURLマッピング操作...
-- "?" を使わず、PHPファイルのURLと本来クエリパラメータと...
** 参照 [#q540935c]
- [[BugTrack/2213]] get_page_uri($page) 関数
- [[official:Plugins/s.inc.php]]
** 対象 [#d873298b]
- ページの表示 (readプラグインのaction)
- read以外のactionのURLは対象外 (標準のまま)
** 設計 [#f5b72059]
- 各ページのURLを作成しているのは get_page_uri($page) で...
- 各種プラグインも get_page_uri($page) によって各ページの...
-- get_page_uri() ができたのが PukiWiki 1.5.2 (2019年3月...
クラス
class PukiWikiStandardPageURIHandler {
// QueryStringの変換
function filter_raw_query_string($query_string);
// ページ名からURIのページ表現部分を生成
function get_page_uri_fragment($page);
// クエリストリングからページ名を取得
function get_page_from_query_string($query_string);
}
lib/init.php:397
// cmdもpluginも指定されていない場合は、QUERY_STRINGをペ...
if (! isset($vars['cmd']) && ! isset($vars['plugin'])) {
$get['cmd'] = $post['cmd'] = $vars['cmd'] = 'read';
$arg = preg_replace("#^([^&]*)&.*$#", "$1", $arg);
if ($arg == '') $arg = $defaultpage;
if (strpos($arg, '=') !== false) $arg = $defaultpage; /...
$arg = urldecode($arg);
$arg = strip_bracket($arg);
$arg = input_filter($arg);
$get['page'] = $post['page'] = $vars['page'] = $arg;
}
** 対応していないプラグインへの対応 [#unsuppoeted_plugins]
各ページへのリンクURL取得手段として PukiWiki 1.5.2 から導...
ページURLに get_page_uri($page) を利用するよう書き換えて...
** カスタマイズ内容 [#hc888a0e]
(URL生成)
各ページのURL は get_base_uri() + 「ページを表すURL片」で...
ページ名を引数にしてこの「ページを表すURL片」の生成する関...
(ページの表示)
「ページを表すURL片」を受け取って、表示(または別のプラグ...
** 既存ロジック不明なところ [#ze114a2e]
make_link.php
クラス Link_interwikiname - function set()
$url = get_interwiki_url($name, $this->param);
$this->url = ($url === FALSE) ?
get_base_uri() . '?' . pagename_urlencode('[[' . $name...
htmlsc($url);
? に続けて [[ name : param ]] を設定しているがこの記述で ...
--------
- 試作してみました。まだ取り込まず、試行錯誤の段階です --...
- 対応しました。 1.5.4 のリリースに含めます。 commit:1dd...
- URLの https://pukiwiki.osdn.jp/_samples/7/?%E9%9A%8...
-- 作れます。少しお待ちを -- [[umorigu]] &new{2022-01-10 ...
-- この先日話していた「通常URLを短縮URLの方へリダイレクト...
-- 「(8) 短縮URLプラグイン ([[s.inc.php>official:Plugins/...
- 窓の杜では 本体へ手を加えることなく実現 なんて紹介さ...
-- 窓の杜の記事は https://forest.watch.impress.co.jp/...
#comment
ページ名: