【mod_rewrite】


CentOs4.4でapache2.xを使用しています。

PHPであるフレームワークを使っていています。

サイト内のページの全てのURLがフロントコントローラとなってしまうため、mod_rewriteを使用して、静的ページっぽく見せたく思っています。

また、アクション名は、GETのaction=*****です。

ただ、ページによっては、アクション名以外のGET値も使用するので、それに関しては、通常通り$_GET['string']が取得できるようにしたいです。(詳細は、例3を見てください。)


例1)
現状:
http://example.com/index.php?action=View
理想:
http://example.com/View/

例2)
現状:
http://example.com/index.php?action=View_List_Search_From_Key
理想:
http://example.com/View/List/Search/From/Key/

例3)
現状:
http://example.com/index.php?action=View_List_Search_From_Key&keyword=searchword&page=3
理想:
http://example.com/View/List/Search/From/Key/?keyword=searchword&page=3



これらを実現させるための.htaccessの書き方を教えてください。

※最後の/は、別に無くても良いです。
※例3は、取得したいGET値を?からスタートしていますが、他の方法でも構いません。 
 スクリプトの中で、GET値を正常に取得できればいいです。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2007/05/23 20:05:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:iwaim No.1

回答回数215ベストアンサー獲得回数19

ポイント35pt

これでどうでしょうか。

RewriteEngine On

RewriteRule ^/View/$ /index.php\?action=View [P,L]

RewriteRule ^/View/List/Search/From/Key/$ /index.php?action=View_List_Search_From_Key [P,L]

RewriteRule ^/View/List/Search/From/Key/\?(.+)$ /index.php?action=View_List_Search_From_Key&$1 [P,L]

id:keijiro

なるほど、ありがとうございます。

この方法でも実現できそうなのですが、ちょっとニュアンスが違います。

アクション名は、ページ名のようなモノで、例に挙げた以上に沢山あります。

なので、View_List_Search_From_Keyのように固定ではなく、

Sample_Hoge_Fuga

のようにページ毎に変化していきます。

2007/05/16 23:28:54
id:tezcello No.2

回答回数460ベストアンサー獲得回数69

ポイント35pt

こんなのでどうでしょうか?

RewriteRule ^(.+)/([^/]+)/?$ $1_$2

RewriteRule ^View([^/]+)?$ index.php?action=View$1&%{QUERY_STRING}

最後の / を _ に置き換え、それを繰り返せいいと思ったのですが、それではうまく動作しませんでした。試行錯誤の末、辿り着いたのですが、チョット説明出来ません。

うちのMac(apache 1.3.33 php4.4.4)ではうまくいっているようですが...

id:keijiro

ある程度うまくいったのですが、

上記にも書いたとおり、アクション名は必ずViewから始まるわけでもないのです。

というわけで、教えていただいた方法から^Viewを取ったのですが、画像関係もRewriteされてしまい、うまくいきませんでした。

思っていた以上に難しいですね。。。

2007/05/17 10:26:59
  • id:wnagata
    RedirectMatch /View(.*) http://localhost/index.php?action=View$1
    だと、例3)の
    ?keyword=searchword&page=3
    の情報が消えてしまいますね
  • id:keijiro
    コメントありがとうございます。
    GETの値が難しくなりますよね。。。
  • id:GEN111
    ややこしいルール書くより
    RewriteRule (.*?)/?$ index.php?action=$1 [QSA]
    これくらいで済ませて
    index.php で View/List/Search/From/Key を適当に処理した方が早い気がする。
  • id:tezcello
    申し訳ないです。
    http://example.com/View/
    ではエラーになってしまいました。
    http://example.com/View
    ならOKです。

    回答のルールの前に
    RewriteRule ^View/$ test.php?action=View [L]
    でも加えておけば良いのかと思います。
  • id:tezcello
    何かキーワードになるものを決めておくとやりやすいのでは?
    それが先頭にある場合のみ置き換えるようにするとか。
    別案として、「実在しない場合のみ」という条件をつけるのは?
    以下の2行を RewriteRule の前に挿入するとどうでしょうか?
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

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

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

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

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