• 締切済み

mod_rewriteルールの正しさについて

お世話になります。 mod_rewriteについて勉強を始め、動的ページを擬似静的ページに変換するルールを記述しようとしているのですが、一向に上手くいきません。。 どなたかアドバイスいただけませんでしょうか? 以下が、実際に組んでいるルールです。 -------------------------------------- RewriteEngine on RewriteRule ^/m/plan/detail/([0-9]+).php$ /m/plan/detail.php?gdid=$1 [L] -------------------------------------- として、例えば http://www.hoge.jp/m/plan/detail/1000.php にアクセスがあった場合に、 http://www.hoge.jp/m/plan/detail.php?gdid=1000 の中身を表示させたいのですが、 「ファイルがありません」の404エラーが返ってきます。。 ちなみに、rewriteモジュールが正しく動作することは確認出来ており、 例えば、 -------------------------------------- RewriteCond %{HTTP_USER_AGENT} (DoCoMo|Vodafone|J-PHONE|SoftBank|UP\.Browser|KDDI|Googlebot-Mobile|Y!J|Nokia) RewriteCond %{REQUEST_URI} !^/m/ RewriteRule ^(.*)\.php$ /m/$1.php [L] -------------------------------------- のようなモバイルサイトとPCサイトのURL正規化ルールは問題なく動きます。 お手数ですが、どなたかアドバイスいただけますと幸いです。

みんなの回答

  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.3

解決結果の報告ありがとうございます。 「^m/plan/detail/([0-9]+).php$」でマッチするのは不思議ですね。 先日こちらの環境で試した結果は、RewriteLogに ------------------------------------------------------------------- (2) init rewrite engine with requested uri /m/plan/detail/1000.php (3) applying pattern '^/m/plan/detail/([0-9]+).php$' to uri '/m/plan/detail/1000.php' (2) rewrite /m/plan/detail/1000.php -> /m/plan/detail.php?gdid=1000 (3) split uri=/m/plan/detail.php?gdid=1000 -> uri=/m/plan/detail.php, args=gdid=1000 (2) local path result: /m/plan/detail.php (2) prefixed with document_root to /var/www/html/m/plan/detail.php (1) go-ahead with /var/www/html/m/plan/detail.php [OK] ------------------------------------------------------------------- と出力されていましたので「/m/plan/detail/1000.php」に 「^/m/plan/detail/([0-9]+).php$」を適用してマッチしています。 試しに「^m/plan/detail/~」変更してみたところ、 やはりこちらの環境ではマッチしませんでした。

yuko8320
質問者

補足

そうですよね。。。 「^/m/plan/detail/([0-9]+).php$」で問題ないと思っていたのですが、 とある書籍に「場合によっては先頭の「/」が邪魔をすることもある」という記述があったもので、試してみたところ見事に動いてしまいました。 今後の参考になればと思い、報告させていただきましたが、 以前、根本的な原因はわからずじまいですので、気長に勉強してみます。

全文を見る
すると、全ての回答が全文表示されます。
  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.2

No.1です。 似たようなRewriteRuleを作って試してみましたが、 こちらの環境では正しく変換されました。 これ以上アドバイスできそうなことはありませんが、 RewriteLogを取れば、何が起きているかヒントが 得られると思います。

yuko8320
質問者

補足

解決しましたので、報告までに。 -------------------------------------- RewriteEngine on RewriteRule ^/m/plan/detail/([0-9]+).php$ /m/plan/detail.php?gdid=$1 [L] -------------------------------------- を -------------------------------------- RewriteEngine on RewriteRule ^m/plan/detail/([0-9]+).php$ /m/plan/detail.php?gdid=$1 [L] -------------------------------------- こうしたところ動きました。

全文を見る
すると、全ての回答が全文表示されます。
  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.1

とりあえず「.」は正規表現のメタ文字ですので、本来は ^/m/plan/detail/([0-9]+)\.php$ とすべきと思います。 ただ、「.」は任意の1文字なので「.php」にもマッチし、 とりあえず動作しそうな気はします。 この前後に他のRewriteRuleがあるなら、それが影響しているかも しれません。 あと、その状態で直接 http://www.hoge.jp/m/plan/detail.php?gdid=1000 にアクセスした場合、404にならず正常表示されることは 確認しているのでしょうか?

yuko8320
質問者

補足

早速アドバイスいただきましてありがとうございました。 確かにエスケープ忘れておりました。。 アドバイスいただいた点で、 1. 他のRewriteRuleを削除して表示出来るか確認 2. リダイレクト先のURLは正しく表示されるか確認 をしてみましたが、1に関しては状況は変わらず、他のRewriteRuleが影響しているようではなさそうでした。。 2に関しては、 -------------------------------------- RewriteEngine on RewriteRule ^/m/plan/detail/([0-9]+)\.php$ /m/plan/detail.php?gdid=$1 [L] -------------------------------------- のRewriteRuleを適用している状態でも問題なく表示が可能でした。。 後はRewriteLogを取って状況を見てみる他ないのでしょうか???

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Rewriteルールの書き方

    お世話になります。 mod_rewriteについて勉強を始め、動的ページを擬似静的ページに変換するルールを記述しようとしているのですが、一向に上手くいきません。。 どなたかアドバイスいただけませんでしょうか? 以下が、実際に組んでいるルールです。 -------------------------------------- RewriteEngine on RewriteRule ^/m/plan/detail/([0-9]+).php$ /m/plan/detail.php?gdid=$1 [L] -------------------------------------- として、例えば http://www.hoge.jp/m/plan/detail/1000.php にアクセスがあった場合に、 http://www.hoge.jp/m/plan/detail.php?gdid=1000 の中身を表示させたいのですが、 「ファイルがありません」の404エラーが返ってきます。。 ちなみに、rewriteモジュールが正しく動作することは確認出来ており、 例えば、 -------------------------------------- RewriteCond %{HTTP_USER_AGENT} (DoCoMo|Vodafone|J-PHONE|SoftBank|UP\.Browser|KDDI|Googlebot-Mobile|Y!J|Nokia) RewriteCond %{REQUEST_URI} !^/m/ RewriteRule ^(.*)\.php$ /m/$1.php [L] -------------------------------------- のようなモバイルサイトとPCサイトのURL正規化ルールは問題なく動きます。 お手数ですが、どなたかアドバイスいただけますと幸いです。

    • 締切済み
    • PHP
  • mod_rewriteについて

    いつもお世話になっております。 mod_rewriteを使ってURLの書き換えをしたいと思っております。 下記のようなファイルがあるとします。 http://www.domain.com/aaa/list.php http://www.domain.com/aaa/detail.php http://www.domain.com/bbb/list.php http://www.domain.com/bbb/detail.php PHPファイルはHTMLに書き換えています。 ---------------------------------------- RewriteEngine on # QUERY_STRING RewriteRule /([a-z]+)\/([a-z]+)\/([0-9]+)\.html$ /$1/$2.php?$3 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*)\.html$ /$1.php [L] ---------------------------------------- http://www.domain.com/aaa/detail/2.html http://www.domain.com/bbb/detail/2.html 上記どちらにアクセスしてもページが表示されませんと なってしまいます。 どうぞ、ご教授お願いいたします。 <環境> PHP:4.3.2 Apache:2.0.40 (Red Hat Linux)

    • ベストアンサー
    • PHP
  • mod_rewriteについて

    mod_rewriteの質問です。 RewriteEngine on RewriteCond %{TIME_DAY}.html -s RewriteRule index.html test.php RewriteRule index.html %{TIME_DAY}.html と記述しているのですが、 %{TIME_DAY}.html が存在するのに、 RewriteCond部分でないと判定され、 %{TIME_DAY}.html が読まれてしまいます。 RewriteCond部分の条件部分の記述方法が間違っているのでしょうか?

  • httpsでmod_rewriteができない

    はじめまして。 Linux環境で、apacheのhttp.confにmod_rewriteを記載し、httpsとhttpを切り替えたいと思っています。 httpd.confに以下のように記述しています。 <IfModule mod_rewrite.c> RewriteEngine on  #(1)httpで/aaaa/bbbbにアクセスされたときにhttps://~に変えたい RewriteCond %{REQUEST_URI} ^/aaaa/bbbb RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R]  #(2)httpsで/cccc/ddddにアクセスされたときにhttp://~に変えたい RewriteCond %{REQUEST_URI} ^/cccc/dddd RewriteCond %{HTTPS} on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R] </IfModule> 上記(1)のhttpでのアクセス時には、mod_rewriteが効いてhttpsへ切り替えられるのですが、 上記(2)のhttpsでのアクセス時には、mod_rewriteが効いていないようでhttpへ切り替えられません。 rewriteログを見てみると、当サイトへhttpでアクセスした場合にはログが出力されますが、 httpsでアクセスした場合には出力されません。 そもそもhttpsでのアクセスの場合にhttpd.confのmod_rewriteが効いていないようです。 ですが、これに対しどこを調査すべきかが分かっていません。 SSLの設定自体は出来ていると思っていて、 https://xxxx.jpのようにアクセスするとちゃんとページが表示されます。 どの当たりに問題がありそうでしょうか? 解析のヒントを頂けたらと思います。 宜しくお願い致します。

  • mod_rewriteで静的化(PHP)

    ご質問です。 例えば以下のような静的なページをmod_rewriteを使って.htaccessで作成しようとしています。 RewriteRuleの記述内容がよくわからず困っています。 また、.htaccessは、どのディレクトリに配置すればよいでしょうか。 どなたかご存知でしたら教えて下さい。 http://localhost/free/index.php?action=member →http://localhost/free/member http://localhost/free/index.php?action=bbs →http://localhost/free/bbs http://localhost/free/index.php?action=usr →http://localhost/free/usr このような記述をしていますが、ご指摘お願いします。 ---------------------- DirectoryIndex index.php RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([0-9A-Za-z)]+)$ index.php?action=$1 [L] ---------------------- 宜しくお願いします。

    • 締切済み
    • PHP
  • mod_rewriteの書き方について

    mod_rewriteの書き方について いつもお世話になっております。 mod_rewiteについて質問させていただきます。 複数の設定をしたいのですが、404のエラーが出てしまい思っている動作になりません。 -------------------------------------------------- RewriteEngine on (1) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule hoge/(.*)\/(.*)\/(.*)\/(.*)\.html$ /hoge/$1/$2.php?$3=$4 [L] RewriteRule hoge/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\/(.*)\.html$ /hoge/$1/$2.php?$3=$4&$5=$6 [L] (2) RewriteRule (.*)\.html$ /$1.php [L] -------------------------------------------------- 上記の設定を記載しております。 (1)はパラメーターがあった場合、URLの書き換えをしています。 ここはちゃんと動作しております。 (2)で、http://www.hoge.com/dir/index.html にアクセスした場合 /dir/index.php を呼び出すことに成功はしています。 ただ、http://www.hoge.com/dir/category.html にアクセスした場合 PHPファイルではなく、HTML(/dir/category.html)の場合404のエラーになってしまいます。 分かりづらい説明で申し訳ございませんが、ご教示よろしくお願いいたします。 [環境]  PHP:5.1.6  Linux:調べられません・・・わりと新しいバージョンです。

  • もう限界です間違い教えてください mod_rewrite .htacsessのりダイレクト

    間違い教えてください エイチティティアクセスファイルに 1番 RewriteEngine on RewriteCond %{HTTP_HOST} ^(hoge\.jp)(:80)? RewriteRule ^(.*) ​http://www.hoge.jp/$1​ [L] 2番 RewriteEngine on RewriteRule ^/$i/$ $i.php?a=$a 上の二つ記述してます 2番が効きません ○○.phpを/○○/ にするだけです 以上

  • mod_rewriteについて

    .htaccessにて、mod_rewriteを使用して、URLの書き換え を行いたいのでがうまく動作してくれません。 上記の記述で http://www.aaaaaaa.jp/php/user/bbb/index.php を http://www.aaaaaaa.jp/bbb/ に変更したいのですが どのように記述したら、動作するのでしょうか。 ご教授をお願いします。 RewriteEngine on RewriteRule ^bbb$ /php/user/bbb/index.php [L] 上記だと、http://www.aaaaaaa.jp/php/user/bbb/index.php のままです。

    • ベストアンサー
    • PHP
  • mod_rewriteの書き方に困っています。

    http://www.○○○.com/1/2/3.htmlといった静的なリクエストを、 .htaccessを使って動的リクエストに読み替えています。 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)\.html$ index.php?a=$1&%{QUERY_STRING}[L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/([^/]*)\.html$ index.php?a=$1&b=$2&%{QUERY_STRING}[L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/([^/]*)/([^/]*)\.html$ index.php?a=$1&b=$2&c=$3&%{QUERY_STRING}[L] 違うのはディレクトリの階層(=引数の数)で、最大でa~eまで5つです。 ご覧のとおり、引数がいくつの場合でも、条件は同じなのです。 もっとスマートに書く方法があると思い、あれこれ試していますが、 自力ではうまくいかず、この形で運用しています。 技術向上のため、簡潔な書き方があれば知りたいです。 お気づきの書き方をご教示下さい。よろしくお願いします。 なお、php等を使ったスクリプトでの解析の提案ではなく、 .htaccessの記述方法としてのアドバイスをお願いします。

  • htaccess mod_rewriteのドット

    ワードプレスをインストールし.htaccessをのぞいてみると以下のようにあります。 RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] 一番下のRewriteRuleは%{REQUEST_FILENAME}がルートディレクトリ直下にあるファイルやディレクトリでなければ、RewriteRule . /index.php [L]を実行するという理解でいいでしょうか? それとRewriteRule . /index.php [L]のドットはどういう意味でしょうか? ドットは一文字ということだとおもいますが、では、mysite.co.jp/kはmysite.co.jp/indx.phpに修正される?ということでしょうか?現状では、mysite.co,jp以下に適当な文字列を入力してmysite.co.jp/dgfdhgfghfdhなどとしてもそのURLのままサイトが表示されてしまいます。記事の部分は404NotFoundなのですが。。 情報はあるのですが、調べても混乱してしまうのでご存知でしたらよろしくお願いいたします。 Apache wordpress

    • 締切済み
    • PHP
このQ&Aのポイント
  • ぷらら光パックの継続方法とは?
  • 契約セットの継続方法について相談したい
  • ぷらら光のトラブルに至った経緯とエラーについて詳しく教えてください
回答を見る