- ベストアンサー
mod_rewriteの変換について
こんにちは。 現在、業務でmod_rewriteの設定をしているのですが、こまっています。 やりたい事は http://localhost/hoge/aaa/bbb/ のアクセスがきた時に http://localhost/hoge/?action_aaa_bbb_index=true の内容を表示したいです。 但し、URLは http://localhost/hoge/aaa/bbb/ という感じです。 他のサイトで調べて、設定をしたのですがどうしても http://localhost/hoge/aaa/bbb/ アクセスすると http://localhost/hoge/以下のディレクトリィが表示されてしまいます。 また最後のオプションを[R]にすると表示はされますが http://localhost/hoge/?action_aaa_bbb_index=true にURLが書き換わってしまいます。 (これは当然なので、認識しています。) 以下、設定を記述します。 よろしくお願いします。 ■環境 windows XP apache2.2 ■記述箇所 httpd.conf --------設定内容--------- RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^/hoge/([0-9A-Za-z]+)/([0-9A-Za-z]+)/?$ /hoge/?action_$1_$2_index=true [L] AllowEncodedSlashes On
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
http://localhost/hoge/ にアクセスしたときに動作するのは どんなプログラムなのでしょうか。たとえば、index.php が 動作するのであれば、 RewriteRule ^/hoge/([0-9A-Za-z]+)/([0-9A-Za-z]+)/?$ /hoge/index.php?action_$1_$2_index=true [L] のようにマッピングすればよいのではないでしょうか。
その他の回答 (2)
- umasikajiro
- ベストアンサー率67% (545/803)
既に解決されたようですが #1に書いた ^/ と/無しの件について 日本Apacheユーザー会でのやり取りより要約 1.httpd.conf のグローバルセクション(Directoryコンテナの外)に記述 <=質問者さんはこれに該当しますね ^/ でマッチします グローバルセクションに <IfModule mod_rewrite.c> rewrite、、、、、 </IfModule> の場合も同じ 2.httpd.conf の<Directory コンテナ内に書いた場合 ^/ にマッチしない 3. .htaccess に書いた場合 ^/ にマッチしない ## と言うのが少なくとも現在のバージョン(2.0系なら2.0.63 1.3系なら1.3.41 2.2系は多分全て)の仕様のようです 但し過去のバージョンに置いては違う動作(.htaccessに記述しても ^/ にマッチするなど)も有るかもしれないらしいです 自分の環境でマッチするかどうかは DocumentRootに例えば test.htm などのFileを置き RewriteEngine on RewriteCond %{REQUEST_URI} !^/test.htm RewriteRule ^(.*)$ /test.htm?$1 [R] と記述して http://hoge.example.com/a.htm などにアクセスし その結果が http://hoge.example.com/test.htm?a.htm <= こうなれば ^/ にマッチしない http://hoge.example.com/test.htm?/a.htm <= ^/ にマッチする と言うことのようです。 回答欄をお借りしてつけたさせていただきました。
お礼
回答ありがとうございます! 自分がたまたまグローバルセクションに記述していた為、 マッチしていたんですね。 サンプルを探しながらやったのでそこまで意識できてませんでした。 ご指摘ありがとうございます。 大変勉強になりました。
- umasikajiro
- ベストアンサー率67% (545/803)
RewriteRule ^/hoge/([0-9A-Za-z]+)/([0-9A-Za-z]+)/?$ /hoge/?action_$1_$2_index=true [L] ↓ /を消して RewriteRule ^hoge/([0-9A-Za-z]+)/([0-9A-Za-z]+)/?$ /hoge/?action_$1_$2_index=true [L] だとどうですか? AllowEncodedSlashes On はクエリーに / が含まれた場合のことだからこの事とは関係ないはず(たぶん) Apache1.3~2.2 までのマニュアルを確認しても http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteBase http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritebase http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritebase いずれも RewriteRule ^oldstuff\.html$ newstuff.html ↑/無しで記述であり RewriteRule ^/oldstuff\.html$ /newstuff.html ↑のように/付きではない
お礼
回答ありがとうございます。 先頭の^/は特に関係なかったようです。 ほかの方の設定をみさせていただいた感じ、ほとんどついていたのと、 ^/を指定して開始を設定した方が、予想外のところでリライトかからずすむので良いかと思いつけました。 もう少し有効性を判断して検討したいと思います。 ありがとうございました。
お礼
回答ありがとうございます! ご指摘どおり index.php を指定したら動作しました。 リダイレクトで表示されたのでindex.phpは必要ないと思っていました。 大変勉強になりました。ありがとうございました。