.htaccessのRewriteRuleについて教えてください。

Tracをインストールして、.htaccessのRewriteRuleを設定していたのですが、
リダイレクトのループが発生しております。
すみませんが、アドバイスを頂けると幸いです。

.htaccess
=========================================
RewriteEngine On
RewriteBase /
RewriteRule ^$ /trac/ [R=301,L]
RewriteRule ^/trac/(.*)$ /trac.cgi/$1 [L]
=========================================

ディレクトリ構成
=========================================
/home/XXXX/www/trac/.htaccess
/home/XXXX/www/trac/trac.cgi
/home/XXXX/www/trac/trac_.cgi
=========================================

もしよければ、RewriteRuleの「L」とは何かや、RewriteRuleの流れを日本語で説明してもらえると助かります。(例えば、tracという文字列できたら、こうなる。という風に。<説明へたですみません。

回答の条件
  • 1人10回まで
  • 登録:2009/06/23 03:24:43
  • 終了:2009/06/30 03:25:02

回答(3件)

id:kntr1 No.1

kntr1回答回数82ベストアンサー獲得回数142009/06/23 04:52:55

ポイント27pt

RewriteBase / 書き換えのベースとなるパス(ベースが明白な場合は不要)。

RewriteRule ^$ /trac/ [R=301,L]

^先頭 $最後なので 何もないパスいわゆるドメインだけでアクセスされた場合、強制的にリダイレクト (Redirect) する。R=301なので永久的に移動。HTTP レスポンスの「301 : Moved Permanently」を返します。

Lがあるので書き換えが行われたら終了

RewriteRule ^/trac/(.*)$ /trac.cgi/$1 [L]

次に^/trac/(.*)$ なので、/trac/で始まり、(.*)なので未入力も含めたパスの場合、/trac.cgi/(入力された値)のアドレスに書き換える、L指定があるので、書き換えが終了したら終了

ちなみに、参考

[C] 次の規則にチェーンする。今の変換パターンと一致し、変換がなされた時だけに次のルールを適用する。

[L] これでRewrite 機能による変換を打ち切ることを示す。

[N] 変換ルールの適用を最初からやり直す。しかし、現在変換済みのURLを対象として行くので、実質上ループをつくることができる。

[R] Redirect させる。つまり、変換されたURLを「Redirect」するものとして、「HTTP/1.1 302 Moved Temporary」のレザルトコードと、Loacation ヘッダに変換されたURLがセットされたレスポンスを返す。

[F] FORBIDDEN を返す。つまり、アクセスが禁止されていることを示す

えっと、上の内容をみるに、やりたい事は、 http://hoge.hoge.jp/

というアクセスがあれば http://hoge.hoge.jp/trac/としたいが

実際は、http://hoge.hoge.jp/trac.cgi/ となってしまうという事かな?

それはRedirectしちゃってるので、もう一度、RewriteRuleにきちゃうからだと思います。

リダイレクトしないと、URLに /trac/とならないからR指定したんだと思います。

だとしたら(.*)ではなく、(.+)として、必ず何か入力されているという条件にしてみては?

ん?ドキュメントルートは/home/XXXX/www/trac/ですか?

ならちがうのかな?

出来ればやりたい事をコメントしていただけますか?

id:nemutaiyo

おぉ! ありがとうございます。こんなに丁寧に説明頂き感謝いたします。理解できました。

やりたいことは、http://XXXX.rental.ne.jp/tracを入力すると、http://XXXX.rental.ne.jp/trac/trac.cgi/に変換したいです。

(つまり、RewriteRule ^$ /trac/ [R=301,L]は不要そうですね)

/home/XXXX/www/がドキュメントルートです。

-------

RewriteBase /

RewriteRule ^/trac/(.*)$ /trac/trac.cgi/$1 [L]

-------

上記に変更しましたが、

http://XXXX.rental.ne.jp/tracと指定すると、

cgiのファイルがブラウザ上で一覧で表示される状態になります。

原因不明のため、今はindex.htmlにmeta refreshを書いて、リダイレクトさせています。

2009/06/23 12:30:31
id:kntr1 No.2

kntr1回答回数82ベストアンサー獲得回数142009/06/24 01:08:54

ポイント27pt

http://XXXX.rental.ne.jp/trac

だと、正規表現的にマッチしないので無視されて、そのまま/home/XXXX/www/trac/が開きますね。

RewriteRule ^/trac/(.*)$ /trac/trac.cgi/$1 [L]

の ^/trac/←が必須条件になっています。

もし/なしでも受け付けたいときは

RewriteRule ^/trac/?(.*)$ /trac/trac.cgi/$1 [L]

としてみてはいかがでしょうか?

? は、前方の文字1文字が0回または1回という意味の正規表現です。

id:nemutaiyo

度々ありがとうございます。

まず、http://XXXX.rental.ne.jp/trac/ で試しても、そのまま/home/XXXX/www/trac/が開きます。

これは、おかしいことでしょうか?(正規表現どおりの動きになってない?私は最後に/付きの場合でも構わないです)

また、?をつけてみましたが、同じ結果(ファイルインデックス表示)になってしまいました。

お時間があれば、また回答ください。

2009/06/24 01:20:55
id:kntr1 No.3

kntr1回答回数82ベストアンサー獲得回数142009/06/24 03:22:50

ポイント26pt

Rewrite エンジンが動いているのが疑問ですね。

環境によって違うのですが、うちの環境では物理パスですね

RewriuteBase を物理パスにしてみてください。

たとえば

RewriteBase /var/www/html/


あと、RewriteEngineがどのように動いているかログをとってみてもいいですね。

  mkdir logs

  touch /var/www/html/logs/rewrite-engine.log

  chmod 777 /var/www/html/logs/rewrite-engine.log

まず、ログファイルを用意しておいて

  

  RewriteEngine On

  RewriteLogLevel 5

  RewriteLog /var/www/html/logs/rewrite-engine.log

   ・・・

ログが取れると思います。

id:nemutaiyo

何回もすみません。ログも出力できるのですね。明日確認します。ありがとうございます。

2009/06/24 03:30:15

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

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません