web-dev-qa-db-ja.com

ApacheのNginxのtry_filesに相当するものは何ですか?

Nginxには try_files 、「ファイルの存在を順番に確認し、最初に見つかったファイルを返す」設定ディレクティブ。私はこれをするのがとてもいいと思います

location ~* \.(gif|jpe?g|css|js)$ {
    try_files $uri 404;
}

これは、Webフレームワークを邪魔することなく、静的ファイルを直接提供する安全な方法です。 Apacheで同じことをするにはどうすればよいですか?

12
phunehehe

私は通常、これをmod_rewriteで実行します。

_ RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
 RewriteRule ^/(.*)$ balancer://app_cluster%{REQUEST_URI} [P,QSA,L]
_

これは、「ファイルシステムにファイルが存在しない場合は、mod_proxy_balancerクラスターを介してプロキシする」ことを意味します。それ以外の場合、ファイルがファイルシステムに存在する場合は、仮想ホストで定義されているDocumentRootに関連してApacheによって提供されます。

しかし、これは私のお気に入りの方法ではありません。主に、リクエストごとにstatシステムコールが必要になるためです。

Mod_proxyを使用すると、Apacheの新しい十分なバージョンがある場合はProxyPassMatchを使用できます( ドキュメントを参照 )。といった:

ProxyPassMatch \.(gif|jpe?g|css|js)$ !

これは! Apacheがその正規表現に一致するリクエストをプロキシする必要があるないことを示します。

古いバージョンのApacheを使用している場合は、ProxyPassディレクティブを使用できますが、これはURIプレフィックスにのみ一致します(これが現在の推奨方法です)。

_ProxyPass /images !
ProxyPass /stylesheets !
_

もちろん、上記のように正規表現マッチングを実行する必要がある場合は、上部に投稿したmod_rewriteルールを変更して、_%{REQUEST_URI}_に対するマッチングを無効にすることができます。

お役に立てば幸いです。

9
loopforever