#author("2021-11-28T22:41:49+09:00","","")
#author("2021-12-04T23:33:26+09:00","","")
* URLカスタマイズの仕組み [#t65b6b10]

- ページ: [[BugTrack]]
- 投稿者: [[umorigu]]
- 優先順位: 低
- 状態: 提案
- 状態: 着手
- カテゴリー: 本体新機能
- 投稿日: 2021-11-27 (土) 18:12:19
- バージョン: 1.5.3

#contents

** メッセージ [#p2d503a3]
PukiWiki の定番のカスタマイズとして、ページURLを変えるものがあります。これを本体書き換え無しで行うための仕組みを導入したい。

URL (path, query 部分) の例

「長い名前を持つページ」
「階層1/名前」というページの場合

- /?%E9%95%B7%E3%81%84%E5%90%8D%E5%89%8D%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8 (標準)
-- 最近のブラウザではアドレス欄でURL decodeされて 「/?長い名前を持つページ」という表示になることが多い
- /%E9%95%B7%E3%81%84%E5%90%8D%E5%89%8D%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8  (Path (サーバー上のファイル) として扱う)
- /%E9%95%B7%E3%81%84%E5%90%8D%E5%89%8D%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8.html  (さらに拡張子を.html にする)
- /?&2dc9e012b6 (短縮URLプラグイン [[official:自作プラグイン/s.inc.php]] での例示
- /?%E9%9A%8E%E5%B1%A41/%E5%90%8D%E5%89%8D (標準)
-- 最近のブラウザではアドレス欄でURL decodeされて 「/?階層1/名前」という表示になることが多い
- /%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  (さらに拡張子を.html にする)
- /?&a66dc2fa8e (短縮URLプラグイン [[official:自作プラグイン/s.inc.php]] での例示
-- 短縮URLは通常URLにリダイレクトするパターンと、直接表示するパターンの2つ
- /2dc9e012b6 (短縮URLをさらにpath風に見せる)
- /a66dc2fa8e (短縮URLをさらにpath風に見せる)
- /123.html (pgid プラグイン利用?)

** 実動作サンプル [#d41e13c1]

*** URLカスタマイズの2パターン [#f92aa1c1]
*** (1) 通常 [#nf0c7789]

- https:// pukiwiki.osdn.jp/_samples/1/
-- https:// pukiwiki.osdn.jp/_samples/1/?%E9%9A%8E%E5%B1%A41/%E5%90%8D%E5%89%8D

*** (2) 末尾 (ページ名).html [#d77d4243]

- https:// pukiwiki.osdn.jp/_samples/2/
-- https:// pukiwiki.osdn.jp/_samples/2/?%E9%9A%8E%E5%B1%A41/%E5%90%8D%E5%89%8D.html

pukiwiki.ini.php

 // Page-URI mapping handler ( See https:// pukiwiki.osdn.jp/?PukiWiki/PageURI )
 class HtmlSuffixPageURIHandler extends PukiWikiStandardPageURIHandler {
	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_string);
		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();


*** (6) 短縮URLプラグイン ([[s.inc.php>official:自作プラグイン/s.inc.php]]) による常時短縮URLのカスタマイズ [#dee2c813]


- https:// pukiwiki.osdn.jp/_samples/6/
-- https:// pukiwiki.osdn.jp/_samples/6/?&a66dc2fa8e
--- (リダイレクト無し)

pukiwiki.ini.php:

 // Page-URI mapping handler ( See https:// pukiwiki.osdn.jp/?PukiWiki/PageURI )
 class ShortUrlPageURIHandler extends PukiWikiStandardPageURIHandler {
	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, $m)) {
			$page = plugin_s_get_page_from_page_id($m[1]);
			return $page;
		}
		return parent::get_page_from_query_string($query_string);
	}
 }
 // $page_uri_handler = null; // default
 $page_uri_handler = new ShortUrlPageURIHandler();


*** (7) 短縮URLプラグイン ([[s.inc.php>official:自作プラグイン/s.inc.php]]) によるリダイレクトのカスタマイズ [#b55ec583]

- https:// pukiwiki.osdn.jp/_samples/7/
-- https:// pukiwiki.osdn.jp/_samples/7/?&a66dc2fa8e
--- https:// pukiwiki.osdn.jp/_samples/7/?%E9%9A%8E%E5%B1%A41/%E5%90%8D%E5%89%8D にリダイレクト

pukiwiki.ini.php:

 // Page-URI mapping handler ( See https:// pukiwiki.osdn.jp/?PukiWiki/PageURI )
 class ShortUrlRedirectPageURIHandler extends PukiWikiStandardPageURIHandler {
	function filter_raw_query_string($query_string) {
		$m = array();
		if (preg_match('#^\&([0-9a-f]{10})$#', $query_string, $m)) {
			return 'cmd=s&k=' . $m[1];
		}
		return $query_string;
	}
 }
 // $page_uri_handler = null; // default
 $page_uri_handler = new ShortUrlRedirectPageURIHandler();


** URLカスタマイズの2パターン [#f92aa1c1]

表示に関わる

- (a) PHPのみで実現できるもの
-- "?" を使って、PHPファイルとクエリパラメータを分けているもの
- (b) Apache/nginxなど、WebサーバーでのURLマッピング操作が必要なもの
-- "?" を使わず、PHPファイルのURLと本来クエリパラメータとして渡す部分を両方 path として見せているもの


*** 参照 [#q540935c]
** 参照 [#q540935c]

- [[BugTrack/2213]] get_page_uri($page) 関数
- [[official:自作プラグイン/s.inc.php]]

*** 対象 [#d873298b]
** 対象 [#d873298b]

- ページの表示 (readプラグインのaction)
- read以外のactionのURLは対象外 (標準のまま)

*** 設計 [#f5b72059]
** 設計 [#f5b72059]

- 各ページのURLを作成しているのは get_page_uri($page) である。get_page_uri() 内の1か所を変更するだけですべてのURLが書き換わる (のが理想)
- 各種プラグインも get_page_uri($page) によって各ページのURLを生成すること
-- 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をページ名かInterWikiNameであるとみなす
 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; // Found '/?key=value'
 	$arg = urldecode($arg);
 	$arg = strip_bracket($arg);
 	$arg = input_filter($arg);
 	$get['page'] = $post['page'] = $vars['page'] = $arg;
 }

*** カスタマイズ内容 [#hc888a0e]
** カスタマイズ内容 [#hc888a0e]

(URL生成)
各ページのURL は get_base_uri() + 「ページを表すURL片」で表現される。 (例: "?FrontPage", "?BugTrack/2525")
ページ名を引数にしてこの「ページを表すURL片」の生成する関数を登録できるようにする。

(ページの表示)
「ページを表すURL片」を受け取って、表示(または別のプラグインアクション)を行う関数を登録できるようにする。


--------
- 試作してみました。 commit:75279a82c7 commit:9f9868f113 まだ取り込まず、試行錯誤の段階です -- [[umorigu]] &new{2021-11-28 (日) 20:22:55};

#comment


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u12. HTML convert time: 0.063 sec.

OSDN