ということをすっかり忘れていた。
通常 %{REQUEST_FILENAME} はそのfileへのfull pathになるけど、VirtualHost内で使用すると%{REQUEST_URI} と同じになる。
REQUEST_FILENAME
The full local filesystem path to the file or script matching the request, if this has already been determined by the server at the time REQUEST_FILENAME is referenced. Otherwise, such as when used in virtual host context, the same value as REQUEST_URI.
何故こうなるかと言うと、virtualhost を使うとHTTP Request を受け取るときに
GET /path/to/filename HTTP/1.0 #1 Host: vhost.example.com #2
#1のGET リクエストのパラメータを受け取った時点ではfileのfull pathがわからず、#2のhost ヘッダを受けとって初めて、virtualhostが確定してdocumentroot が決定するから。だと思う。
代替案
DOCUMENT_ROOT というパラメータがあるのでこれと併用する。
まとめ
REQUEST_URIを使えば、virtualhost の使用に関わらず同じ書き方になるので、普段からREQUEST_URIを使うようにしとけば迷わないのかな。
virtualhost 未使用時
ex: RewriteCond の条件に書く場合
RewriteCond %{REQUEST_FILENAME} -f RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} -f
virtualhost 使用時
REQUEST_URIもREQUEST_FILENAMEも同じなので、次の2つは同じ。
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} -f RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} -f