* 相対/絶対 URI について($script、get_script_uri等) [#ge7ad818] - ページ: [[BugTrack2]] - 投稿者: [[ぃぉぃぉ]] - 優先順位: 普通 - 状態: 着手 - カテゴリー: その他 - 投稿日: 2007-03-08 (木) 20:37:49 - バージョン: #contents ** 関連 [#u4243420] - [[BugTrack2/101]] サイト内のページへのリンクにもhost名を含む完全なuriが使われている - [[BugTrack2/124]] 他のポートでのhttps使用 ** メッセージ [#ff7b6db9] [[cvs:lib/func.php]]で、get_script_uri()は // Get absolute-URI of this script とコメントがあるように、絶対URIを出力するための関数と思われます。 get_script_uri()をgrepしてみましたが、24ファイルほどヒットしました。ほとんど下名((自分をへりくだって言う言葉。[[goo辞書>http://dictionary.goo.ne.jp/search.php?MT=%B2%BC%CC%BE&search_history=%B2%BC%CC%BE&kind=jn&kwassist=0&mode=0&jn.x=30&jn.y=12]]。))は使ったことのないプラグインだったのでよくわかりませんが、ほとんどがこの関数をつかわず相対URIの扱いで構わない気がしますが、いかがでしょうか。 ~これらの修正を行って動作確認でもして、変更箇所を示したらofficialに採用される可能性はあるでしょうか?それならやろうかなと思うのですが。 もともと相対URIで使用したかったのは、当方の環境ではDeleGateを使用してSSL化しているため、Webサーバーから見ると常に平文通信のため、リンクが全てhttpsにならずにhttpになってしまったのです。 で、相対URIならいけるかな、と。試しにget_script_uriで$script=''を返すようにしましたが、それなりに動きました。 *** 現状の修正案 [#m2fe00a8] #ls2 ** 求められている状態 [#n450c028] それぞれ、DirectoryIndex(例えばindex.php)を削ったものと、削っていないものとがありうる (他にも条件があるかもしれない) *** 絶対URI (absolute URI) [#j61eb657] http://example.com/ http://example.com/path?query=value など、相対 URI に加えてスキーム、ホスト名、ポート番号を含んだ完全な URI。 相対URIにすると正常な動作を妨げるものがある -RSS出力 -- 絶対URIでないと、購読者がリンクにたどり着けない。 - 自分自身のURIをコンテンツの中に表示させる場合 -- 例: NAVIBARのTOPICPATH'''非'''使用時(pukiwiki.skin.php) -HTTP Location ヘッダで使用するURI -- http://www.studyinghttp.net/header#Location -リンクは絶対URIと同様の働きをする。 -$link['reload']の出力が変わっている、ということは、get_script_uriをgrepしただけでは全ての影響箇所を見つけられていない。 -- [[ぃぉぃぉ]] - get_script_uri() から 例えば http://pukiwiki.sourceforge.jp/dev/ のようなアドレスを取得して、クッキーの有効パスに利用しているようなプラグインもあります。 -- &new{2007-03-09 (金) 08:11:40}; -- これに対してはむしろ index.php のあるディレクトリURLを直接返す関数が欲しいです。たしか get_script_uri 内で index.php をくっつけてますよね?くっつけてから分離するというのは無駄っぽいので。 -- &new{2007-03-09 (金) 08:16:42}; --- このコメントは逆の事を言われているように思います。デフォルトでは index.php つきのURI が得られます。関数の中では、管理者の設定に応じて index.php といったファイル名を ''削る'' 処理を行っています。 -- [[henoheno]] &new{2007-03-11 (日) 21:12:21}; --- そうでしたか。確認はしていなかったので。とにかく、ディレクトリURLを直接返すAPI関数が欲しいかな、と。 -- &new{2007-03-12 (月) 07:16:45}; #comment *** 絶対パスによる相対URI (absolute-path reference) [#te9bbb8d] /path?query#fragment /path/file?query#fragment 必ず ''/'' で始まる #comment *** 相対パスによる相対URI (relative-path reference)[#x86983c0] ./path/file ../path/file?query - 絶対URIに比べ転送量が小さい - %%get_script_uri()を呼ばずにすむ(空の文字列に置き換えればよい)ので速度も上がる%% 相対URIを使うかどうかと、どのようにして実現するかは別の話です -- [[henoheno]] *** 求められている状態のコメント [#n0c4f321] - 相対URIでかまわない部分はget_script_uri()を'./'に置き換えて、get_script_uri()は絶対URIを返すという仕様でどうでしょう。 -- [[ぃぉぃぉ]] &new{2007-03-10 (土) 21:42:24}; - <a href="?hoge"> は Another HTML-lint で怒られたと思います。$script = 'index.php' にしないといけないと思います。 -- &new{2007-03-09 (金) 08:21:13}; -- そうすると今度は index.php を省略した URL を使用できなくなると思います。大したことではないと思うかどうかは人によりますね。 -- &new{2007-03-09 (金) 08:21:59}; -- <a href="./?hoge">なら通りそうですた。$script = './'でok? -- [[ぃぉぃぉ]] &new{2007-03-09 (金) 09:38:33}; - ./ におきかえようとしているようですが、index.php とは限らないし、index.php を省略できる環境とも限らないですよね。 -- &new{2007-03-11 (日) 07:02:56}; -- おーっと、そうでした。index.phpを省略できるかどうか、考慮が漏れていました。残念。やっぱり関数を呼ぶか式を入れるかが必要になるんですね。 -- [[ぃぉぃぉ]] &new{2007-03-11 (日) 10:45:00}; -- デフォルトは index.php などのスクリプト名、pukiwiki.ini.php のスクリプト名を省略する設定が有効の場合 ./ 、というようにするのが良いでしょうね。 -- &new{2007-03-11 (日) 07:05:44}; - 指摘があったようにindex.phpの省略/非省略がありうるので、定数'./'に置き換えは無理ですね。 -- [[ぃぉぃぉ]] &new{2007-03-11 (日) 15:45:42}; - いっそのこと[[静的コンテンツに偽装>cubic9.com:PukiWiki/改造/静的コンテンツに偽装]]みたいなのを標準で取り込んでしまった方が簡単かもしれませんね。 -- [[Logue]] &new{2007-03-20 (火) 13:45:05}; - <a href="?hoge"> は Another HTML-lint で怒られるとしても、HTML としては正しいのでそれでいいのではないでしょうか?Another HTML-lint もバグかなにかだと認識していたようなしていなかったような -- &new{2007-12-30 (日) 20:15:25}; -- 結局、[[BugTrack2/213/lib/get_script_uri]] では相対スクリプトURIの取得に rel (index.php を返す)と rel_cut (空文字を返す) があるようですが、常に ($script_directory_index にもよらず)、空文字を返す仕様でよいのではないでしょうか? -- &new{2007-12-31 (月) 22:37:22}; -- それはなぜ -- &new{2008-01-01 (火) 14:33:03}; -- 「結局」とつなげているのでその上の文章が理由となります。index.php を返す仕様がほしかったのは、ただの Another HTML-lint 対策です。それは必要ないのでは。 -- &new{2008-01-01 (火) 19:20:06}; #comment -------- ** コメント [#i542f783] *** コメント: 従来までの推移 [#hb0abc89] - お疲れ様です。細かく拝見していませんが・・・相対パスであってはならない局面があるのに今まではそれが安易に扱われていたため、(最初のステップとして)絶対パスを定義しなければ動かない様にした、という経緯で正しいです。次のステップとしては、複数のタイプを使い分けるようなスマートな解決策が求められています。「サイト自身の位置」という一つの情報は一箇所で管理しないとコードが増えますから、get_script_uri()を拡張・・・というか引数をを作り変えて、これに与える引数によって複数のタイプを選択できるようにすると楽なのだろうと思います。 -- [[henoheno]] &new{2007-03-11 (日) 00:25:42}; -そもそもget_script_uri()を呼んでいるのがおかしいですよね。$scriptがあるのだから。 -- [[ぃぉぃぉ]] &new{2007-03-11 (日) 15:43:56}; -- get_script_uri() と $scriptの関係を補足します。$scriptは互換性のためにだけ残されています。get_script_uri() があるのにグローバル変数 $script を参照しているのはおかしい、というのが現状です。 -- [[henoheno]] &new{2007-03-11 (日) 20:57:15}; *** コメント: 実現方法 (グローバル変数か関数か) [#vd021d1d] -以下の仕様でいかがでしょ。 -- [[ぃぉぃぉ]] &new{2007-03-11 (日) 15:43:56}; ++ $script_rel(相対URI)、$script_abs(絶対URI)をlib/init.phpで設定。 -- [[ぃぉぃぉ]] &new{2007-03-11 (日) 15:45:42}; ++ 現状の$script、init.php以外で呼んでいるget_script_uri()を$script_relもしくは$script_absに置き換える。 -- [[ぃぉぃぉ]] &new{2007-03-11 (日) 15:46:58}; - 互換性を考慮した場合、グローバル変数 $script は(従来通り)、lib/init.php あたりで絶対URLとして正規化した後は、変更する場面があってはいけません。ただし、グローバル変数で値を持つというのは(いつ改変されるか解らないので)本来危険な設計ですから、今後の対応としては正しい値を持つ正規の関数(例えばget_script_uri()がそれを担当できる)に対して、どのような形(絶対、相対、・・・etc)で自身のURIが欲しいかを問い合わせる形にすると堅固になります。 -- [[henoheno]] &new{2007-03-11 (日) 10:16:04}; -- できれば関数を呼び出す回数を減らしたいので、$scriptを相対URI、$script_absを絶対URIとしてlib/init.phpで設定し、あとは使う側で選んでもらう、ということでどうでしょう。多少負荷軽減になりますよね? -- [[ぃぉぃぉ]] &new{2007-03-11 (日) 11:07:09}; -- ニーズとして求められているURIは二つではないので、その方向だとグローバル変数がさらに要るか、場面場面で別の加工をする必要があるでしょう。 -- [[henoheno]] &new{2007-03-11 (日) 21:01:34}; -- セキュリティ、およびメンテナンスの観点から、グローバル変数をむやみに増やすべきではないという点と、重要な情報をグローバル変数に収める(改変される可能性を作る)べきでないという点と、場面ごとにバラバラなコードがあちこちに発散してしまうため、メンテナンスコストが増えてミスが起こり易くなるという点もコメントしておきますね -- [[henoheno]] &new{2007-03-11 (日) 21:05:55}; -- クラスで作るのはどうか、といった話題もあると思います。PHP4なので以下略。 -- [[henoheno]] &new{2007-03-11 (日) 21:07:52}; - [[ぃぉぃぉ]]さんも「やっぱり関数を呼ぶか式を入れるかが必要になるんですね」などとコメントされている通りなのですが、この件のポイントは、「''ニーズが動的に変化する''」という点にあると思います。index.php付きのURIを知りたいときもあるし、いらない時もあるし、絶対URIが欲しい時もあるし、相対パスで欲しい時もありえます。また、状況に応じてそれが変化する事もあります。今までは絶対URIで統一させていたので(そのサイトからコンテンツを提供し続けるのであれば)どの場面でも大体問題なかったのですが、蓋を開けるのであれば、それぞれのリクエストに柔軟に応じてあげなければいけないだろうという事です。 -- [[henoheno]] &new{2007-03-11 (日) 21:51:26}; - グローバル変数はなしだと思います。現在の $script は get_script_uri() が呼び出されたときに自動生成されます。あと、下位互換性を考えたら get_script_uri は現状どおり絶対URIを返して、get_script_rel とか get_script_uri('rel') などが相対URIを返す、とした方が楽かもしれません。そして変えられるところをちくちく変えていく、と。 -- &new{2007-03-12 (月) 07:12:32}; -- なるほど、$scriptの現状が分かってきました。「下位互換性を考えたら get_script_uri は現状どおり絶対URIを返し」という点は同意します。 -- [[ぃぉぃぉ]] &new{2007-03-13 (火) 12:25:16}; - ずいぶんかかりましたが、get_script_uriに引数を与えて出力を変える方向で実装してみました。 -- [[ぃぉぃぉ]] &new{2007-04-20 (金) 03:09:25}; -- [[./lib/get_script_uri]] -- &new{2007-04-20 (金) 03:27:31}; #comment *** コメント [#j92644bd] - 絶対URL の取得に失敗して、質問箱にくる人もよくいますよね。相対パスでよいならその辺のことで質問箱にくる人は少なくなって良いかもしれません。 -- &new{2007-03-09 (金) 08:08:11}; -- 絶対パスが必要なものはそういう対応をする必要があると思います。具体的なplugin等が分かればどんどん紹介して下さい。 -- [[ぃぉぃぉ]] &new{2007-03-09 (金) 12:34:03}; - contents を追加し、関連ページのリンクを追加し、とても大雑把に話題をまとめさせていただいています。すごく乱暴ですいません・・・ -- [[henoheno]] &new{2007-03-11 (日) 20:18:47}; - henohenoさん、整理お疲れ様です。検討しやすくなりました。ありがとうございます。 -- [[ぃぉぃぉ]] &new{2007-03-13 (火) 12:23:28}; - [[BugTrack2/260]] -- &new{2007-07-18 (水) 22:29:58}; - [[official:質問箱4/212]] -- &new{2007-12-30 (日) 19:46:39}; - 最終目標(まとめ)について。[[現状の修正案>#m2fe00a8]] の方は使えそうですか? -- &new{2007-12-31 (月) 20:05:31}; -- いいえ。です。部分的には利用できると思いますがアイデアの段階で多少異なります。現状のまとめは叩き台(関数名が決定でいいのか、など)なのでそれらをまず決定して作成に入りたいところです。また「まとめ」のつもりなのでコメントは移動させてください。関数名の議論などの場所が必要ならば別の項目にする予定です(作っていただいても結構です)。 -- &new{2007-12-31 (月) 22:04:06}; - https:// などはそのままで、でも絶対パスで指定したい場合というのやはりあるんですかね? 'absuri', 'abspath', 'relpath' ? 1, 2, 3? 'fulluri', 'abspath', 'relpath'? 'full', 'abs', 'rel'? -- &new{2008-01-05 (土) 09:51:14}; - さて、大分仕様は固まりつつありそうなので、現在の「まとめ」に対して何か意見をください -- &new{2008-01-08 (火) 22:41:15}; -- 関数設置パッチも作成しました。この仕様でよければとりあえずとりこんでもらって、別の BugTrack でもたてて必要箇所をリストアップ、ちくちく修正していくと良いと思います。 -- &new{2008-01-08 (火) 22:41:15}; #comment ---- *最終目標(まとめ) [#zc226003] 叩き台。関数名、仕様も決めてみます。 -pukiwiki.ini.php にて絶対URIか絶対パスか相対パスのうちどれを使用するかのフラグをグローバル変数で用意する。$script_path_reference とする。 -- $script_path_reference は以下の何れかの値を取る --- 'full' - 絶対(Full)URI (absolute URI) --- 'abs' - 絶対パス (absolute path-reference) --- 'rel' - 相対パス (relative path-reference) - 絶対URIの初期化用関数として init_script_full_uri($full) 関数を用意する -- 旧 get_script_uri($init_uri = "") の動作。中々 $init_uri の引数が邪魔なので分離する。 - グローバル変数に従って get_script_uri() は絶対URIか絶対パスか相対パスのどれかを返す。 -- また get_script_uri($path_reference) の形式で 'full', 'abs', 'rel' の何れかを指定することで明示的に対応する値を返す - 必ず絶対URI、絶対パス、相対パス、のいづれかでなければならないプラグイン等は $get_script_uri($path_reference) の形式を使用するように''すべて変更する''。''自作プラグインも変更してもらう''。 -- 例えば必ず絶対URIでなければならないものとして --- RSS出力 -- 絶対URIでないと、購読者がリンクにたどり着けない。 --- HTTP Location ヘッダで使用するURI -- http://www.studyinghttp.net/header#Location -- などがある。 -- 必ず相対URIでなければならない、というものはない、むしろあってはならない。はず。 --- よって実質的に get_script_uri('rel') が使用されることはない。はず。 --- ちなみに get_script_uri('rel') は $script_directory_index にもよらず常に空文字を返す。 -get_pkwk_baseuri 関数の設置 -- PukiWiki を設置したディレクトリへの絶対URI(index.php を除いた絶対スクリプトURI)、絶対パス、相対パスを返す -- get_script_uri() と同様に $path_reference 引数を持つ。同様にデフォルトではグローバル変数に従った動作。 -- 絶対スクリプトURIの値から index.php を除いて、クッキーの有効パスに利用しているようなプラグインがある。そのようなプラグインを get_pkwk_baseuri('full') を使用するように''すべて変更する''。 -get_page_uri($page) 関数の設置 (ついでに) -- ページ参照へのリンクURIを返す。get_script_uri() . '?' . rawurlencode($vars['page']) のような所を''全て変更する''。 -- mod_rewrite や PHP_INFO を使用して html 偽装させたい場合などに、この関数を少し書き換えれば済むようになる。 -- http://www.revulo.com/PukiWiki/Plugin/RewriteMap.html のパッチを使用できる(get_page_uri 関数のみ要変更)。関連話題: [[plus:BugTrack/54]] -- これも同様に $path_reference 引数を持つ。同様にデフォルトではグローバル変数に従った動作。 **とりあえずの対応をする場合 [#o2bd77f7] -pukiwiki.ini.php にて絶対URIを使用するか相対URIを使用するかのフラグ $script_path_reference グローバル変数を用意する。// Experimental と書いておく。 -init_script_full_uri($init_uri) の用意。get_script_uri($init_uri) の動作を使用していた箇所を''変更する''。少ないはず。 -get_script_uri() の変更 -get_pkwk_baseuri() 関数の設置 -get_page_uri($page) 関数の設置 (ついでに) その後ちくちく変更していく。 絶対URIが必須な自作プラグインなどは、 $script = function_exists('init_script_full_uri') ? get_script_uri('full') : get_script_uri(); のように対応していってもらう。 *パッチ [#p82c0bf9] 関数設置パッチ。 diff -ru pukiwiki.orig/lib/func.php pukiwiki.path-reference/lib/func.php --- pukiwiki.orig/lib/func.php 2008-01-08 08:50:30.656250000 -0500 +++ pukiwiki.path-reference/lib/func.php 2008-01-08 10:06:47.437500000 -0500 @@ -709,8 +709,54 @@ } } -// Get absolute-URI of this script -function get_script_uri($init_uri = '') +// Get Page URI (would be modified to use mod_rewrite, PATH_INFO) +function get_page_uri($page, $path_reference = '') +{ + $script = get_script_uri($path_reference); + $pageuri = $script . '?' . rawurlencode($page); + return $pageuri; +} + +// Get PukiWiki base URI (no index.php) +function get_pkwk_baseuri($path_reference = '') +{ + $script = get_script_uri($path_reference); + if (($pos = strrpos($script, '/')) !== FALSE) { + $baseuri = substr($script, 0, $pos + 1); + } + return $baseuri; +} + +// Get script URI +function get_script_uri($path_reference = '') +{ + static $script_full, $script_abs, $script_rel; + global $script_path_reference; + $path_reference = ($path_reference !== '') ? $path_reference : + (isset($script_path_reference) ? $script_path_reference : 'full'); + switch ($path_reference) { + case 'rel': + if (isset($script_rel)) return $script_rel; + $script_rel = ''; + return $script_rel; + break; + case 'abs': + if (isset($script_abs)) return $script_abs; + $script = init_script_full_uri(); + $parsed = parse_url($script); + $script_abs = $parsed['path']; + return $script_abs; + break; + default: // case 'full': + if (isset($script_full)) return $script_full; + $script_full = init_script_full_uri(); + return $script_full; + break; + } +} + +// Init absolute-URI of this script and return it (old get_script_uri) +function init_script_full_uri($init_uri = '') { global $script_directory_index; static $script; diff -ru pukiwiki.orig/lib/init.php pukiwiki.path-reference/lib/init.php --- pukiwiki.orig/lib/init.php 2008-01-08 08:50:30.671875000 -0500 +++ pukiwiki.path-reference/lib/init.php 2008-01-08 09:43:50.828125000 -0500 @@ -129,9 +129,10 @@ // INI_FILE: Init $script if (isset($script)) { - get_script_uri($script); // Init manually + init_script_full_uri($script); // Init manually } else { - $script = get_script_uri(); // Init automatically + $script = init_script_full_uri(); // Init automatically + // Set $script to support old versions } ///////////////////////////////////////////////// diff -ru pukiwiki.orig/pukiwiki.ini.php pukiwiki.path-reference/pukiwiki.ini.php --- pukiwiki.orig/pukiwiki.ini.php 2008-01-08 08:50:24.937500000 -0500 +++ pukiwiki.path-reference/pukiwiki.ini.php 2008-01-08 10:00:06.843750000 -0500 @@ -118,6 +118,10 @@ // Shorten $script: Cut its file name (default: not cut) //$script_directory_index = 'index.php'; +// Use absolute (full) uri or absolute path-reference or relative path-reference for internal links +// Experimental function [[dev:BugTrack2/213]] +//$script_path_reference = 'rel'; // 'full' or 'abs' or 'rel' + // Site admin's name (CHANGE THIS) $modifier = 'anonymous';