web-dev-qa-db-ja.com

条件付きロジックを実現するためのIFの代わりにNginxtry_files

OpenCartのApachehtaccess書き換えルールに相当するものを含むNginx仮想ホスト構成を作成しようとしています。これがオリジナルです:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

私が理解しているように、これは、リクエストがファイルではなく、ディレクトリではなく、上記の拡張子のいずれかを持つファイルが含まれていない場合は、最後の行に従って書き直すことを意味します。

これが私が現在Nginxで使用しているものです:

  location / {
    # This try_files directive is used to enable SEO-friendly URLs for OpenCart
    try_files $uri @opencart;
  }

  location @opencart {
    rewrite ^/(.+)$ /index.php?_route_=$1 last;
  }

これは機能しているようですが、これらの特定のファイルのチェックがないのではないかと心配しています。私が見つけたものは、IFを使用せずにその条件を複製する方法を示唆するものはありません。また、条件のこの部分の理由、つまり、これらの特定のファイルが重要である理由についてもわかりません。

私の質問は次のとおりです。

  1. これを行う方法はありますか?つまり、IFを使用せずにそれらのファイルタイプに関する条件と同等のNginxを記述しますか?

  2. Nginxの例の最初のロケーションブロックをtry_files $ uri $ uri/@opencart;($ uri /を追加)に変更する必要があります

助けてくれてありがとう。

1
David Rahrer

その特定のRewriteCondの目的は、nonexistent静的ファイルの要求がOpenCartに渡されるのを防ぐことです。

別のlocationでこれを行うことができます。たとえば(頭のてっぺんから離れているので、微調整が必​​要な場合があります):

location ~ \.(ico|gif|jpg|jpeg|png|js|css)$ {
    try_files $uri =404;
}
2
Michael Hampton