ページのリダイレクトをしたい

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

メッセージ

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

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

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

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

  • リダイレクトにも種類がありますよね。
    1) Wikipedia のようにページ単位で #redirect を設定できるようにする。
    2) pukiwiki.ini.php / :config/redirect などに書かれた正規表現に基づいてルーティングするような仕組みを作る。 -- bee 2016-11-10 (木) 03:38:03
    • たぶん意図は 2) だと思うのですが、 A->B, B->C, C->A のようなルールを書いたときに連続で適用するのか、 ループしたらどうやって検出するのか、 など最終的に機能限定版 mod_rewrite を再実装することになってしまったりして…? -- bee 2016-11-10 (木) 03:46:42
    • 1) もリダイレクトループの問題は考えなきゃいけないですね…。 -- bee 2016-11-10 (木) 04:23:28
  • 1a) rename プラグインを修正して
    #freeze
    #redirect(NEW_PAGE_NAME)
    のようなページを自動生成する機能を付ける、#redirect は freeze されている場合のみ実行するようにする、#redirect は /?cmd=read&page=PAGE_NAME の場合は発動させない、 という感じではどうか。 -- bee 2016-11-10 (木) 03:55:11
    • リダイレクト先に /?cmd=read&page=PAGE_NAME 形式でリダイレクト元がリンクされると便利かも。 -- bee 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 2016-11-10 (木) 04:18:47
  • 頻繁に変更するところではないのと、正規表現を使いたくなるので、pukiwiki.ini.phpにルールを書こうと考えてました。ページ単位であればご提示の既存プラグインが使えますし。リダイレクトループ検出はしません -- umorigu 2016-11-10 (木) 08:50:53
  • 携帯対応も考えると alias.inc.php や redirect.inc.php は結構危ない感じだったりしますが、それ以前にページ数が倍になりますからね。検索が…。 -- bee 2016-11-14 (月) 02:04:55
  • ルーティングする仕組みを上手く設計すると BugTrack2/195 も解決できるかも、ですね。 -- bee 2016-11-14 (月) 02:18:04
  • シンプルに実装してみました。BugTrack2/195など他の問題は残念ながら解決できません。別対応にしたいと思ってます commit:a021ead072 -- umorigu 2016-11-14 (月) 05:05:17
  • ルールについてドキュメントに記載しました。official:PukiWiki/PageRedirection -- umorigu 2016-11-18 (金) 01:53:23
  • このサイトでは BugTrack2/xxx -> BugTrack/2xxx のリダイレクトを↓のように実現できます -- umorigu 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 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 2016-11-16 (水) 00:36:47
    • Todo: '#(.*)#' => function($matches) { /* mbstring でゴニョゴニョ */ return $new_page;} をあとで試してドキュメントに書く。 -- bee 2016-11-16 (水) 00:44:09
    • 今の実装だとmatchしたら必ずredirectしてしまうので、これは動きません。replace結果を元のページと比較するべきでしたね -- umorigu 2016-11-18 (金) 01:13:59
    • 変換後にもページ名が変わらなかったらリダイレクトしないようにしました commit:22b6214f55 -- umorigu 2016-11-18 (金) 01:34:26
  • ありがとうございます!(時間がなくてまだ動作テストできてない…orz) -- bee 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 プラグインも自前生成か…) -- 2016-12-07 (水) 22:02:43
    • (1)リダイレクト設定は頻繁には変えない想定であること。(2)recentプラグインのソースであるcache/recent.datはいくつかのページを更新すれば内容が入れ替わって旧ページの情報はなくなること。からリダイレクトへの特別な対応は不要だと思ってます。cache/recent.datを手動で削除してしまえば再生成されるのですけど、挙動を見るために今はあえて残しています。そんなに困らないと思ってます -- umorigu 2016-12-08 (木) 05:56:33
    • popularも同じじゃないかな... 確かに、新しい機能に対応していない各pluginが、「意図してそうしているのか」「対応漏れなのか」は個別に確認が必要ですね -- umorigu 2016-12-08 (木) 06:02:12
    • recentはBugTrack/676のためにmake_pagelink()を使わずに自前対応してるのかもしれません -- umorigu 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 コメ主 2016-12-08 (木) 23:02:02
    • この処理に置き換えるのでもよさそうですね -- umorigu 2016-12-10 (土) 18:55:04
    • 見ましたけどrecent.inc.phpの処理とmake_pagelink()内での処理がかなり重複しているので、そのまま置き換えると無駄な処理が多くなってしまうようです -- umorigu 2016-12-10 (土) 19:08:59
    • そういう事でしたか。わざわざ調査までしていただき、ありがとうございました。 -- 2016-12-07 (水) 22:02:43 コメ主 2016-12-12 (月) 20:55:22


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-12-12 (月) 20:55:22
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.297 sec.

OSDN