mod_rewriteの挙動が不可思議。ログをみると、余計に不可思議・・・お助けを・・・

このQ&Aのポイント
  • CentOS4、Apache2を使っています。mod_rewriteの設定を行いたいのですが、リクエストに対して正しい結果が返されず、エラーログを確認したところ不可思議な挙動が見られました。.htaccessに設定した内容を修正しても同様のエラーが発生し、原因がわかりません。どうすれば正常な動作になるのでしょうか?
  • mod_rewriteの設定に関して、HTTP要求に対して正しい結果を返すためにも慎重な操作が必要です。しかし、設定を行ってもエラーログを確認すると予期せぬ挙動が起きており、なかなか望む動作になりません。.htaccessファイルの書き方やサーバーの設定に問題があるのか、原因を突き止めることができません。アドバイスをいただけると助かります。
  • CentOS4とApache2を使用しており、.htaccessファイルを編集してmod_rewriteの設定を行いましたが、予期しない不具合が発生しています。エラーログを確認しても原因が特定できず、どのように修正すべきか迷っています。正しい書き方や他の設定項目に何か問題があるのでしょうか?アドバイスをお願いします。
回答を見る
  • ベストアンサー

mod_rewriteの挙動が不可思議。ログをみると、余計に不可思議・・・お助けを・・・

CentOS4、Apache2を使っています。 ============================================ http://example.com/hogehoge というリクエストに対して、 mod_rewriteで http://example.com/index.php?QS=hogehoge の結果を返すようにしたいと思っています。 (http://example.com/ に対しては、http://example.com/index.php?QS= の結果を返せばOK) ============================================ そこで、 「.htaccess」に <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^/(.*)$ /index.php?QS=$1 [L] </IfModule> と書いたのですが、 http://example.com/hogehoge にアクセスしたら、not foundになってしまいました。 Apacheのエラーログをみると、 File does not exist: /var/www/example.com/htdocs/hogehoge でした。 で、mod_rewriteのログをみると下記のようでした。 ========================== ***.**.***.*** - - [11/Feb/2008:22:37:25 +0900] [example.com/sid#b80e7dd8][rid#b81db290/initial] (3) [per-dir /var/www/example.com/htdocs/] strip per-dir prefix: /var/www/example.com/htdocs/hogehoge -> hogehoge ***.**.***.*** - - [11/Feb/2008:22:37:25 +0900] [example.com/sid#b80e7dd8][rid#b81db290/initial] (3) [per-dir /var/www/example.com/htdocs/] applying pattern '^/(.*)$' to uri 'hogehoge' ***.**.***.*** - - [11/Feb/2008:22:37:25 +0900] [example.com/sid#b80e7dd8][rid#b81db290/initial] (1) [per-dir /var/www/example.com/htdocs/] pass through /var/www/example.com/htdocs/hogehoge ========================== (1)「/var/www/example.com/htdocs/hogehoge -> hogehoge」 と (2)「applying pattern '^/(.*)$' to uri 'hogehoge'」 というのが、不思議です。 どこのサイトを見ても、 RewriteEngine on RewriteRule ^/abc/(.*)$ /new/$1 [R=301,L] のようにやっているので、 ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ (2)は 「applying pattern '^/(.*)$' to uri '/hogehoge'」のはずだと思うのですが・・・。 ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ かといって <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^(.*)$ /index.php?QS=$1 [L] </IfModule> としてみると、今度はhttp://example.com/ にアクセスされたときに500エラーとなってしまいまして。。。 上の☆で囲んだ部分の疑問が強いので、問題の切り分けができていないかもと重い、 このエラーの原因は深くまだつっこんでいません。 どうして、このようになってしまうのでしょうか? (1)の挙動は、なんかしらの設定によるのでしょうか? そして、どうすれば、一番上に書いた、希望している動作となるのでしょうか? 以上、どなたかお教えいただければ、幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

.htaccess は、設置しているディレクトリが起点になるので、 マッチングさせるパターンは ^/(.*)$ ではなく、^(.*)$ に なります。また、変換されたものが再度このパターンに一致すると 無限ループするようです。 下記のように変換後のパターンは除外するとよいでしょう。 <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^index.php$ - [L] RewriteRule ^(.*)$ /index.php?QS=$1 [L] </IfModule>

takashi_tm
質問者

お礼

ご回答ありがとうございます。 なるほど、そういうおちだったのですね。 そういえば、mod_rewriteって.htaccessで書いたことなかったかも。。。 なお、冷静にちょっとみたら、500エラーの際の(mod_rewriteの)ログをみたら、明らかに、いんたーなるなんちゃらで、無限ループおこしてました。 ありがとうございます。 ところで、お手すきでしたらでかまわないのですが、 当てずっぽう的にいろいろ試したら、 <IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteRule ^(.*)$ index.php?QS=$1 [L] </IfModule> でうまくできました。 でも「RewriteBase /」は、index.php?QS=$1 [L]のiの直前に「/」がつくことと同じと考えていたのですが、 なぜ、うまくできちゃったのでしょうか? 恐縮ですが、もしお手すきでしたら、教えていただければ幸いです。 以上、よろしくお願い申し上げます。

その他の回答 (2)

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.3

> でも「RewriteBase /」は、index.php?QS=$1 [L]のiの直前に「/」がつく > ことと同じと考えていたのですが、 > なぜ、うまくできちゃったのでしょうか? RewriteLog を見ると、ループが「initial URL equal rewritten URL」で 検出されていました。想像ですが RewriteRule で index.html を /index.html に書き換えた場合は、/ の部分が一致しないので、 止まらないのではないでしょうか。 なお、書かれた方法で変換した場合、常に QS=index.html に なっていませんか。

takashi_tm
質問者

お礼

なんどもすみません。 >RewriteLog を見ると、ループが「initial URL equal rewritten URL」で >検出されていました。想像ですが RewriteRule で index.html を >/index.html に書き換えた場合は、/ の部分が一致しないので、 >止まらないのではないでしょうか。 あ、なるほどですね。。。 が、 >なお、書かれた方法で変換した場合、常に QS=index.html に >なっていませんか。 なっておらず、希望のとおりの動作になっています。 まあ、結果オーライかもしれませんが・・・ちょっと気持ち悪いかんじです。 ありがとうございます。

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.2

ええっと、.(ドット) はエスケープしないといけないですね。 <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^index\.php$ - [L] RewriteRule ^(.*)$ /index.php?QS=$1 [L] </IfModule> でした。

takashi_tm
質問者

お礼

再度ありがとうございます。 お世話様です。 私も見逃してました。 どうもありがとうございます。 以上、短文ではございますが、ありがとうございました。

関連するQ&A

  • mod_rewriteについて教えてください。

    mod_rewriteについてお願いします。 「a」と「b」というフォルダにそれぞれ「index.html」「test.html」が入っています。「a」と「b」で「index.html」「test.html」の内容はちがいます。 わたしが一番望んでいるのは http://example.com/a/以下にアクセスがあった場合 http://example.com/b/以下にリダイレクトさせるというものです。 例) http://example.com/a/test.htmlにアクセスがあったらhttp://example.com/b/test.htmlにリダイレクト。 ------------------------------------------------------------ Options +FollowSymLinks AddHandler cgi-script htaccess <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^/a/$ /b/$1 [R=302,L] </IfModule> ------------------------------------------------------------ としてみましたが、リダイレクトされません。 ちなみに RewriteRule ^$ /b/$1 [R=302,L] と書くと、http://example.com/にアクセスがあった場合 http://example.com/b/にリダイレクトされましたので mod_rewriteには対応しております。 ご教授のほど、よろしくお願いいたします。

  • 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が効かない!

    サーバの運用上、mod_rewriteを使う必要が出来たので設定してみたのですが効きません。 FreeBSD4.11+Apache1.3.33で httpd.confファイルに直接書き込んで試しています。 LoadModule rewrite_module modules/mod_rewrite.so AddModule mod_rewrite.c のどちらも書いてあるにもかかわらず、下記のテスト設定を試してみたらローカルIPからアクセス出来てしまいます。 RewriteEngine on RewriteCond %{REMOTE_ADDR} ^192\.168\.1\. ←ローカルネットワークのアドレス RewriteRule ^.*$ - [F] どのようにしたらいいですか? アドバイスお願い致します。

  • mod_rewriteでの'?'表示

    http://www.example.com/search.cgi?a=mypage&b=go&c=1&d=2 を、 http://www.example.com/mypage/go/search?c=1&d=2 に変えたいですが、どのようにすればよいのでしょうか? htaccessでは・・・ Options +FollowSymlinks RewriteEngine on RewriteRule ^/([0-9A-Za-z]+)\/([0-9A-Za-z]+)\/search?c=([0-9A-Za-z]+)&d=([0-9A-Za-z]+)$ /search.cgi?a=$1&b=$2&c=$3&d=$4 [L] にしてもアクセスできません… APACHEマニュアルでは「?」は文字数指定と言う文法に なるらしく、「?」を表示させたいです。 http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteRule どうすればよろしいでしょうか?ご教示ください。

  • mod_rewrite設定について

    mod_rewrite設定について mod_rewriteでcgiに渡す引数の一部のみを書き換えることは可能でしょうか。 具体的には下記のような挙動を実現したいです。 http://mydomain.com/test.cgi?status=true&action=1 ↓ http://mydomain.com/test.cgi?status=false&action=1 2つ目の引数は複数のパターンが想定されています。 下記のようなrewriteの設定を試してみましたが リダイレクトされませんでした。 ~~~~~~~~~~~~~~~~~~~~~ RewriteEngine on RewriteRule ^/test.cgi?status=true(.*) http://mydomain.com/test.cgi?status=false$1 [QSA] ~~~~~~~~~~~~~~~~~~~~~ 助言をいただけないでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • HTML
  • 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部分の条件部分の記述方法が間違っているのでしょうか?

  • mod rewriteの適用範囲

    どなたか分かったら教えてください。 mod rewriteを使おうと思い、httpd.confに以下のような 記述をしたのですが、これでhtdocs内はmod_rewirteが適用されたのですが、その下のディレクトリでは適用されません。 (Object not found!) /htdocsの下のディレクトリ全部に適用されるようにする方法はありますでしょうか? <Directory /home/htdocs> Options Indexes FollowSymLinks Includes MultiViews ExecCGI AllowOverride All Order allow,deny Allow from all RewriteEngine On RewriteRule ^id-([0-9]+).html+ log.cgi?id=$1 </Directory>

  • mod_rewriteの書き方について

    よろしくお願いします。 サーバーをhttp://80codeを使っています。 今回、mod_rewriteを使って静的アドレスにしようとしていますが、 404エラー(見つかりません)がでてしまい、うまく表示されません。 設定が間違っていますでしょうか? http://repo.teki2.com/に両方のファイルとも設置しています。 接続しに行っているアドレスは、http://repo.teki2.com/1/ です。 http://repo.teki2.com/index.php?mode=1 だとうまくいきます。 .htaccessの内容 RewriteEngine on RewriteRule ^/([0-9a-zA-Z]+)/$ /index\.php?mode=$1 [L] index.phpの内容 <?php echo $mode; ?> よろしくお願いします。

    • 締切済み
    • CGI
  • mod_rewriteで$_GETが受け取れない

    mod_rewriteで$_GETが受け取れない現象の原因が分からず、困っています。 前の質問は、内容に間違いがあったため、削除して書き直します。 公開サーバはVineLinux3.2でApache2を動かしています。 ドキュメントルートに以下の内容の.htaccessを配置しています。 RewriteEngine on RewriteRule ^index/([a-z0-9A-Z_]*)?$ index.php?action=$1 RewriteRule ^index/([a-z0-9A-Z_]+)/([a-z0-9A-Z_]+)/([a-z0-9A-Z_]+)$ index.php?action=$1&type=$2&value=$3 ところが、 index/hogehogeにアクセスしても、 index.phpの結果しか返ってきません。 index.phpでvar_dump($_GET);を実行した結果は、 array(0) {}となります。 WindowXP + XAMPP1.6.6a で構築したローカル環境では期待通り、 index/hogehogeにアクセスすることでindex.php?action=hogehogeの結果が返ってきます。 どこに原因があるのか全く分からず、困っております。 宜しくお願いします。

  • mod_rewriteの書き方について

    Apacheのmod_rewriteを使って以下のことを実現したいです。 ~~~~~~~~~~ http://example.com/apple/orange/grape にアクセスが来た場合、 http://example.com/apple/orange/grape.png に転送 ~~~~~~~~~~ よろしくお願いします。