#author("2016-12-10T19:09:24+09:00;2016-12-10T19:08:59+09:00","","")
#author("2016-12-12T20:55:22+09:00","","")
* ページのリダイレクトをしたい [#i8417b16]

- ページ: [[BugTrack2]]
- 投稿者: [[umorigu]]
- 優先順位: 低
- 状態: 完了
- カテゴリー: 本体新機能
- 投稿日: 2016-11-10 (木) 01:46:01
- バージョン: 1.5.1
- リリース予定バージョン: 1.5.2

** メッセージ [#w125f446]
標準のrenameプラグインで複数ページのリネームをすることはできるが、旧ページのURLへアクセスされると、新規ページ作成が行われてしまう。

旧ページから新ページへのリダイレクト機能が欲しい。

自由なリダイレクト設定は脆弱性の発生要因にもなるため、管理者だけが設定できるようにする。

*** 例 [#v902bd49]

- BugTrack2/396 を BugTrack/2396 にリネームした後、 BugTrack2/396 にアクセスされた時に、BugTrack/2396 にリダイレクトしたい。



--------
- リダイレクトにも種類がありますよね。~
1) Wikipedia のようにページ単位で #redirect を設定できるようにする。~
2) pukiwiki.ini.php / :config/redirect などに書かれた正規表現に基づいてルーティングするような仕組みを作る。 -- [[bee]] &new{2016-11-10 (木) 03:38:03};
-- たぶん意図は 2) だと思うのですが、
A->B, B->C, C->A のようなルールを書いたときに連続で適用するのか、
%%ループしたらどうやって検出するのか%%、
など最終的に機能限定版 mod_rewrite を再実装することになってしまったりして…? -- [[bee]] &new{2016-11-10 (木) 03:46:42};
-- 1) もリダイレクトループの問題は考えなきゃいけないですね…。 -- [[bee]] &new{2016-11-10 (木) 04:23:28};
- 1a) rename プラグインを修正して~
 #freeze
 #redirect(NEW_PAGE_NAME)
のようなページを自動生成する機能を付ける、#redirect は freeze されている場合のみ実行するようにする、#redirect は /?cmd=read&page=PAGE_NAME の場合は発動させない、
という感じではどうか。 -- [[bee]] &new{2016-11-10 (木) 03:55:11};
-- リダイレクト先に /?cmd=read&page=PAGE_NAME 形式でリダイレクト元がリンクされると便利かも。 -- [[bee]] &new{2016-11-10 (木) 04:28:00};
- 関連:
[[official:自作プラグイン/alias.inc.php]] /
[[official:自作プラグイン/redirect.inc.php]] /
wiki.revulo.com/pukiwiki/patch/rewritemap /
xoops.hypweb.net/modules/pukiwiki/1519.html -- [[bee]] &new{2016-11-10 (木) 04:18:47};
- 頻繁に変更するところではないのと、正規表現を使いたくなるので、pukiwiki.ini.phpにルールを書こうと考えてました。ページ単位であればご提示の既存プラグインが使えますし。リダイレクトループ検出はしません -- [[umorigu]] &new{2016-11-10 (木) 08:50:53};
- 携帯対応も考えると alias.inc.php や redirect.inc.php は結構危ない感じだったりしますが、それ以前にページ数が倍になりますからね。検索が…。 -- [[bee]] &new{2016-11-14 (月) 02:04:55};
- ルーティングする仕組みを上手く設計すると [[BugTrack2/195]] も解決できるかも、ですね。 -- [[bee]] &new{2016-11-14 (月) 02:18:04};
- シンプルに実装してみました。[[BugTrack2/195]]など他の問題は残念ながら解決できません。別対応にしたいと思ってます [[commit:a021ead072]] -- [[umorigu]] &new{2016-11-14 (月) 05:05:17};
- ルールについてドキュメントに記載しました。[[official:PukiWiki/PageRedirection]] -- [[umorigu]] &new{2016-11-18 (金) 01:53:23};

- このサイトでは BugTrack2/xxx -> BugTrack/2xxx のリダイレクトを↓のように実現できます -- [[umorigu]] &new{2016-11-14 (月) 05:11:39};
 // Page redirect rules
 $page_redirect_rules = array(
 	//'#^RenamedOldProject($|(/(.+)$))#' => 'NewProject$1',
 	'#^BugTrack2/(\d\d\d)$#' => 'BugTrack/2$1',
 	'#^BugTrack2/(\d\d)$#' => 'BugTrack/20$1',
 	'#^BugTrack2/(\d)$#' => 'BugTrack/200$1',
 );
- preg_matchが常に3回走るのがいまいちなので$replaceに関数を指定できるようにしました。 [[commit:fd549e4343]] -- [[umorigu]] &new{2016-11-15 (火) 02:03:09};
 // Page redirect rules
 $page_redirect_rules = array(
 	//'#^FromProject($|(/(.+)$))#' => 'ToProject$1',
 	//'#^FromProject($|(/(.+)$))#' => function($matches) { return 'ToProject' . $matches[1]; },
 	'#^BugTrack2/(((\d+)($|/.+$))|(.+$))#' => function($matches) {
 		if (isset($matches[3]) && $matches[3]) {
 			$number = $matches[3];
 			if (strlen($number) === 3) {
 				$new_page = 'BugTrack/2' . $number . $matches[4];
 			} else if (strlen($number) === 2) {
 				$new_page = 'BugTrack/20' . $number . $matches[4];
 			} else if (strlen($number) === 1) {
 				$new_page = 'BugTrack/200' . $number . $matches[4];
 			} else {
 				$new_page = 'BugTrack/' . $number . $matches[4];
 			}
 		} else {
 			$new_page = 'BugTrack/' . $matches[5];
 		}
 		return $new_page;
 	},
 );
- 無名関数を利用するのは PHP 5.3+ な機能なので、ドキュメントないし pukiwiki.ini.php に注釈が欲しいですね。 -- [[bee]] &new{2016-11-16 (水) 00:36:47};
-- Todo: '#(.*)#' => function($matches) { /* mbstring でゴニョゴニョ */ return $new_page;} をあとで試してドキュメントに書く。 -- [[bee]] &new{2016-11-16 (水) 00:44:09};
-- 今の実装だとmatchしたら必ずredirectしてしまうので、これは動きません。replace結果を元のページと比較するべきでしたね -- [[umorigu]] &new{2016-11-18 (金) 01:13:59};
-- 変換後にもページ名が変わらなかったらリダイレクトしないようにしました [[commit:22b6214f55]] -- [[umorigu]] &new{2016-11-18 (金) 01:34:26};
- ありがとうございます!(時間がなくてまだ動作テストできてない…orz) -- [[bee]] &new{2016-11-19 (土) 19:00:14};
- devサイトをアップデートした([[開発日記/2016-12-07]])という事で、巡回してみて疑問が1つ。recentプラグインはリダイレクト対応させないのでしょうか?ページ内からの関連リンク先一覧$related に登録させないためだかでmake_pagelink() を通さず直接生成しているのと、リダイレクトを確認してないので表示中のページならUIを変える機能([[BugTrack/676]])がBugTrack2/xxx -> BugTrack/2xxx で動いてないです。(ん?BugTrack/676 って事は、popular プラグインも自前生成か…) --  &new{2016-12-07 (水) 22:02:43};
-- (1)リダイレクト設定は頻繁には変えない想定であること。(2)recentプラグインのソースであるcache/recent.datはいくつかのページを更新すれば内容が入れ替わって旧ページの情報はなくなること。からリダイレクトへの特別な対応は不要だと思ってます。cache/recent.datを手動で削除してしまえば再生成されるのですけど、挙動を見るために今はあえて残しています。そんなに困らないと思ってます -- [[umorigu]] &new{2016-12-08 (木) 05:56:33};
-- popularも同じじゃないかな... 確かに、新しい機能に対応していない各pluginが、「意図してそうしているのか」「対応漏れなのか」は個別に確認が必要ですね -- [[umorigu]] &new{2016-12-08 (木) 06:02:12};
-- recentは[[BugTrack/676]]のためにmake_pagelink()を使わずに自前対応してるのかもしれません -- [[umorigu]] &new{2016-12-08 (木) 06:07:43};
-- [[commit:4683d446b562736dce7a199dc9dd168f455fe168]] で分岐させたのだから、make_pagelink() に対して「アンカー無しで表示中ページが飛び先の場合」だけBugTrack/676 と同様な仕様変更をするかどうかにかかわらず、単純なページリンク生成する側を
 $items .= ' <li>' . make_pagelink($page) . '</li>' . "\n";
のように置き換えずに自前生成を踏襲したのは何でだったかな~が「$related に登録」ウンヌンなので、理由がハズレならお気になさらないでください。(ls2 プラグインのように、id をa タグに割り振ってるわけでもないのに、う~ん…) -- 2016-12-07 (水) 22:02:43 コメ主 &new{2016-12-08 (木) 23:02:02};
-- この処理に置き換えるのでもよさそうですね -- [[umorigu]] &new{2016-12-10 (土) 18:55:04};
-- 見ましたけどrecent.inc.phpの処理とmake_pagelink()内での処理がかなり重複しているので、そのまま置き換えると無駄な処理が多くなってしまうようです -- [[umorigu]] &new{2016-12-10 (土) 19:08:59};
-- そういう事でしたか。わざわざ調査までしていただき、ありがとうございました。 -- 2016-12-07 (水) 22:02:43 コメ主 &new{2016-12-12 (月) 20:55:22};

#comment

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

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.194 sec.

SourceForge