DocumentRoot /var/www/html/
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/abc/def.jpg$ http://abc.def [R]
VirtualHostディレクティブに記述しているのでしょうか?
私の環境でも同じですので、おそらく仕様なのではないかと思います。
以下の方法で対処している人もいるようです。
http://developer.ti-da.net/e2371733.html
以下の記事の人は、%{DOCUMENT_ROOT}/を%{REQUEST_FILENAME}の前に記述して対処しているようです。
http://underrails.seesaa.net/article/58225749.html
※私は上記どちらの方法でも可能でした。
「RewriteCond %{REQUEST_FILENAME} !-f」と記述すると、存在するファイルだったらルールを適用しない
この前提が間違っているようです。
! は文字列の前に付けることで否定の意味を示します。オプション -f を否定することはできません。
おそらく、この式は -f が有効になり、常に true を返す結果になるでしょう。
ほんとですか???http://net-newbie.com/trans/mod_rewrite.html#RewriteCondに「以上すべてのテストについて、 エクスクラメーションマーク ('!') を前に置くことにより それらの意味を否定することができます。」とありますが・・・
的確な解決策が無く、コメント欄も締め切っておられるので静観しておりましたが・・・
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 を書き換えれば良いという話になるのですが
それについてよい方法が見当たらないので静観しておりました。
とりあえず原因までで、申し訳無いのですが!の位置などではなく
記述に足りない部分があるという点お知らせいたしたく、回答とさせていただきました。
※コメント欄空けておいていただけると、この程度のことは即時伝わりますし
解答欄を汚す事もありませんので、お勧めしておきます。
なるほど。少しためして、また結果報告させて頂きます。
色々と試して見ました。
①def.jpgを/var/www/html/def.jpgにコピーする → 症状変わらず
②RewriteBaseを設定する → できないapache再起動でエラー(RewriteBase: only valid in per-directory config files)
引き続き検討してみます。
VirtualHostディレクティブに記述しているのでしょうか?
私の環境でも同じですので、おそらく仕様なのではないかと思います。
以下の方法で対処している人もいるようです。
http://developer.ti-da.net/e2371733.html
以下の記事の人は、%{DOCUMENT_ROOT}/を%{REQUEST_FILENAME}の前に記述して対処しているようです。
http://underrails.seesaa.net/article/58225749.html
※私は上記どちらの方法でも可能でした。
どんぴしゃです!!!!!VirtualHostです!できました!
どんぴしゃです!!!!!VirtualHostです!できました!