VirtualHost内のREQUEST_FILENAMEはREQUEST_URIと同じになる

ということをすっかり忘れていた。

通常 %{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