mod_rewriteの質問です。「RewriteCond %{REQUEST_FILENAME} !-f」と記述すると、存在するファイルだったらルールを適用しないという意味かと思いますが、以下の設定をして、http://abc.def/abc/def.jpgにアクセスすると、/var/www/html/abc/def.jpgが存在しても、リダイレクトされます。これはなぜでしょうか?


DocumentRoot /var/www/html/

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/abc/def.jpg$ http://abc.def [R]

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2009/04/08 11:45:35
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rouge_2008 No.3

回答回数595ベストアンサー獲得回数351

ポイント100pt

VirtualHostディレクティブに記述しているのでしょうか?

私の環境でも同じですので、おそらく仕様なのではないかと思います。

以下の方法で対処している人もいるようです。

http://developer.ti-da.net/e2371733.html

以下の記事の人は、%{DOCUMENT_ROOT}/を%{REQUEST_FILENAME}の前に記述して対処しているようです。

http://underrails.seesaa.net/article/58225749.html

※私は上記どちらの方法でも可能でした。

id:cbic

どんぴしゃです!!!!!VirtualHostです!できました!

2009/04/08 11:45:16

その他の回答2件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

「RewriteCond %{REQUEST_FILENAME} !-f」と記述すると、存在するファイルだったらルールを適用しない

この前提が間違っているようです。


! は文字列の前に付けることで否定の意味を示します。オプション -f を否定することはできません。

おそらく、この式は -f が有効になり、常に true を返す結果になるでしょう。


参考サイト

id:cbic

ほんとですか???http://net-newbie.com/trans/mod_rewrite.html#RewriteCondに「以上すべてのテストについて、 エクスクラメーションマーク ('!') を前に置くことにより それらの意味を否定することができます。」とありますが・・・

2009/04/07 21:22:54
id:kn1967 No.2

回答回数2915ベストアンサー獲得回数301

ポイント30pt

的確な解決策が無く、コメント欄も締め切っておられるので静観しておりましたが・・・


apacheのドキュメントにもある方式ですし ! の位置に間違いはありません。

Apache 1.3 URL Rewriting Guide


では、なぜ動かないのか・・・?


それでは

  RewriteCond %{REQUEST_FILENAME} !-f

にファイル名を入れて見ましょう。


http://abc.def/abc/def.jpg であればファイル名はdef.jpgなので

  RewriteCond def.jpg !-f

となります。

ディレクトリに関しては記述されていないので

ファイルを探す基点は /abc ではなく / になります。


つまり

http://abc.def/def.jpg

が存在するかどうかを判断基準としているので・・・


対処としてはパスを明確にするか、各サブディレクトリ毎に対応するように

RewriteCond を書き換えれば良いという話になるのですが

それについてよい方法が見当たらないので静観しておりました。


とりあえず原因までで、申し訳無いのですが!の位置などではなく

記述に足りない部分があるという点お知らせいたしたく、回答とさせていただきました。


※コメント欄空けておいていただけると、この程度のことは即時伝わりますし

解答欄を汚す事もありませんので、お勧めしておきます。

id:cbic

なるほど。少しためして、また結果報告させて頂きます。

色々と試して見ました。

①def.jpgを/var/www/html/def.jpgにコピーする → 症状変わらず

②RewriteBaseを設定する → できないapache再起動でエラー(RewriteBase: only valid in per-directory config files)

引き続き検討してみます。

2009/04/07 22:44:09
id:rouge_2008 No.3

回答回数595ベストアンサー獲得回数351ここでベストアンサー

ポイント100pt

VirtualHostディレクティブに記述しているのでしょうか?

私の環境でも同じですので、おそらく仕様なのではないかと思います。

以下の方法で対処している人もいるようです。

http://developer.ti-da.net/e2371733.html

以下の記事の人は、%{DOCUMENT_ROOT}/を%{REQUEST_FILENAME}の前に記述して対処しているようです。

http://underrails.seesaa.net/article/58225749.html

※私は上記どちらの方法でも可能でした。

id:cbic

どんぴしゃです!!!!!VirtualHostです!できました!

2009/04/08 11:45:16
  • id:kn1967
    ドキュメントを読み直してみると REQUEST_FILENAME は
    ファイルネームではなくフルパス。

    http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteBase
    >>
    REQUEST_FILENAME
    リクエストにマッチしたファイルまたはスクリプトの、 完全なローカルファイルシステムのパス。
    <<

    私の回答は間違いが含まれておりました。申し訳ないです。
  • id:kn1967
    RewriteBase でエラーということはAlias使用?、単なる記述ミス?

    [R]って事は、後に続くものがあるって事なので、そのあたりがミソ?

    考えれば考えるほど、深い霧に包まれていく・・・。
  • id:b-wind
    RewriteBase は Directory ディレクティブか .htaccess 等で使うための物。
    グローバルでは設定出来ない。(必要もない)

    [R] についても [R,L] とした方が適切だが問題の本質ではなさそう。
    [PT] オプションを付けない限りは Alias も ScriptAlias も関係ない。
    基本的な書き方についてもさほど問題は無い。

    mod_rewrite 関連で記述しているのはこれだけ?
    複雑に絡み合うモジュールだからもし一部だけ抜き出しているなら全部書くようにしてください。
  • id:kn1967
    >>RewriteBase: only valid in per-directory config files
    >RewriteBase は Directory ディレクティブか .htaccess 等で使うための物。

    ご指摘、感謝。



  • id:rouge_2008
    ちなみに回答に書いた方法以外では、httpd.confのDirectoryディレクティブに書くと大丈夫でした。
    ただしこの場合は、以下のように「^/」ではなく「/」としないと動作しない可能性があります。
    RewriteRule ^abc/def.jpg$ http://abc.def [R,L]
  • id:cbic
    解決できました。皆様ありがとうございました。

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

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

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

回答リクエストを送信したユーザーはいません