path_infoを用いて動的URLを静的URLに変換する作業を検討中です。下記サイトに「http://exam.su-jine.com/path_info.php?var1=path&var2=infohttp://exam.su-jine.com/path_info/path/info.html という URI に」する方法が掲載されているのですが、「http://exam.su-jine.com/path/info.html 」とするにはどうしたら良いのでしょうか?


http://blog.su-jine.net/archives/2004/08/_path_info.html

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:ito-yu No.1

回答回数323ベストアンサー獲得回数14

ポイント10pt

前の質問でmod_rewriteについて聞いていませんでした?path_infoを使うくらいなら、以下のmod_rewriteを使ってみませんか。.htaccessに記述してください。


<IfModule mod_rewrite.c>

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?q=$1 [L]

</IfModule>


存在しないファイル/ディレクトリがリクエストされたとき、index.phpをコールします。

htmlに限定するなら、mod_actionsも使えますね。.htaccessに


Action text/html /index.php


とか書いて、path_infoを見てください。

id:dak

そのwriteルールだと、希望の動作はしないと思うのですが。。q=とか、そういうんじゃないです。mod_actionsは全く知らないものだったので、他の方法が駄目だったら調べてみたいと思います。

2005/07/24 00:45:44
id:szkn No.2

回答回数15ベストアンサー獲得回数0

ポイント25pt

URLはダミーです(一応,少し関係あるかも)


まず, DirectoryIndex でデフォルトのアクセスファイル名を指定します.


※処理をさせたいファイルが, pathInfo.php なら,

 DirectoryIndex pathInfo.php


これで, http://exam.su-jine.com/path/info.htmlが リクエストされた際には,

http://exam.su-jine.com/path というディレクトリ/ファイルがなければ)

$_SERVER['PATH_INFO']に /path/info.html がセットされて,

http://exam.su-jine.com/pathInfo.php が呼ばれます.


※ちなみに,仮に http://exam.su-jine.com/path.php というファイルがある場合,

 $_SERVER['PATH_INFO']は /info.html がセットされて,

 http://exam.su-jine.com/path.php が呼ばれます.


なお,リンク先はサーバ上のファイル(path_info.php)に拡張子をつけず,

個別にそのファイルのファイルタイプを指定することで処理していますが,

そんなメンドウなこと(処理させるファイル名を全てについて AddType ...(略)... が必要)をしなくても

Options +Multiviews

を指定すれば,拡張子なしのリクエストに適当な拡張子のファイルを返すので,

環境と状況によればこちらの方が簡単です.

id:dak

前半部分は理解できたと思います。ありがとうございました。さくらインターネットを使用しているので、Optionsは使えないようです。すぐに取り掛かれないのですが、ご指摘の方法で実現可能かどうか、試してみたいと思います。

2005/07/24 16:39:03
id:HackySS No.3

回答回数13ベストアンサー獲得回数0

ポイント25pt

参照されているページの方法は、

path_info

というphpスクリプトが見かけのURIにも必要だが、

それをなくし、ルートから直接のパスに見せかけたい、

と言うことでしょうか。

それならば、いずれにしてもmod_rewriteを使ったほうが良いと思います。


もし、

*問答無用で全てのリクエストを*

http://example.com/path/info.html

という見かけのURIで、

http://example.com/path_info.php/path/info.html

という実アクセスとして扱いたければ、


RewriteRule ^(.*)$ index.php$1

などとし、PATH_INFOを見るのが良いかと。

でも、本当に全てのリクエストに対してプレフィクスをつけてしまいますので、

必要なら、ルールを付け加える必要があります。

id:dak

「path_infoというphpスクリプトが見かけのURIにも必要だが、それをなくし、ルートから直接のパスに見せかけたい」です。その通りです。「もし〜」以下は申し訳ないのですが、意味が分かりませんでした。

2005/07/24 16:42:14
id:ito-yu No.4

回答回数323ベストアンサー獲得回数14

ポイント10pt

じゃ、これで。

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteRule ^(.+)/(.+)¥.html$ path_info.php?var1=$1&var2=$2 [L]

</IfModule>


http://exam.su-jine.com/path_info/path/info.html と呼ぶと、 http://exam.su-jine.com/path_info.php?var1=path&var2=info に変換してリクエストが渡されます。


しかしながら、フォルダ階層が2つ、3つと様々なリクエストには対応できません。あとは結局php側で振り分けることになるでしょう。あとはご自分で考えられてはいかがでしょうか?


しかし、あなたが参考にしているページも、php側でpath_infoを分解しているだけなんだから、私の1回目の回答の$_GET[’q’]をphpで分解すればいいだけですよ。


ちなみに、mod_actionsは、存在しないディレクトリには効果が有りませんでした、だから今回の例では使えません。見なかったことにしてください。失礼しました。

id:dak

rewriteルールが指定した結果にならないものです(/path_info/も消えていませんし、$1,$2の配置も違います)。

---

最終的に、同時に質問として出していたmod_rewriteを使用する方法で解決しました。

http://www.hatena.ne.jp/1122115909

ご回答頂いた皆様、有難うございました。

2005/07/27 14:59:35

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません