人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

.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という文字列できたら、こうなる。という風に。<説明へたですみません。

●質問者: nemutaiyo
●カテゴリ:コンピュータ インターネット
✍キーワード:.htaccess CGI HOME ON trac
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● kntr1
●27ポイント

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/ですか?

ならちがうのかな?

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

◎質問者からの返答

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

やりたいことは、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を書いて、リダイレクトさせています。


2 ● kntr1
●27ポイント

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回という意味の正規表現です。

◎質問者からの返答

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

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

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

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

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


3 ● kntr1
●26ポイント

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

・・・

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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ