1

私は ngnix が初めてで、場所のディレクティブがよくわかりません。次の構成のWebサイトがあります。

location / {
    rewrite ^(.*)$ /index.php last;
}

#assets

location /web/assets/ {
    rewrite ^(/web/assets/.*)$ $1 break;
}

location /web/assets/cache/ {
    if (!-f $request_filename) {
        rewrite ^/web/assets/cache/(.*)$ /web/assets/cache/index.php last;
    }
}

Web サイトでは、すべてのリクエストが index.php にリダイレクトされますが、リダイレクトしたくない "assets" フォルダー (/web/assets/) があります。このフォルダー内には、「キャッシュ」というサブフォルダーがあります。このサブフォルダー内のファイルが要求され、そのファイルが存在しない場合、要求は、ファイルを作成してキャッシュに保存する php ファイルにリダイレクトされます。これは、たとえば前処理された css、js などに役立ちます。ファイルは、最初に必要になったときに作成されます。

この構成はうまく機能しますが、html5 ボイダープレートの提案に従って、いくつかのヘッダーをアセット ファイルに送信したいと思います。 master/conf/expires.conf )、およびこれらのディレクティブを追加すると:

location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
  expires 1M;
  access_log off;
  add_header Cache-Control "public";
}

# CSS and Javascript
location ~* \.(?:css|js)$ {
  expires 1y;
  access_log off;
  add_header Cache-Control "public";
}

以前のリダイレクトは機能しません。これは、nginx がすべての一致する場所を実行するのではなく、最初の場所のみを実行するためです。私の質問は、ngnix config で書き換えディレクティブとヘッダー ディレクティブを組み合わせる方法です。

4

1 に答える 1

1

各リクエストは、1 つのロケーション ブロックでのみ処理できます。また、 の使用はifお勧めできません。try_filesははるかに効率的です。また、同じ uri に書き換える書き換えルールがあります (まったく役に立ちません)。

あなたのconfをあなたのニーズにとってより効率的であると私が信じているものに書き直すことを許可してください。何か間違っている場合はお知らせください

#this is just fine as it was
location / {
  rewrite ^(.*)$ /index.php last;
}

#web assets should be served directly
location /web/assets/ {
  try_files $uri $uri/ @mycache;
}

#this is the mycache location, called when assets are not found
location @mycache {
  expires 1y;
  access_log on;
  add_header Cache-Control "public";
  rewrite ^/web/assets/(.*)$ /web/assets/cache/index.php last;
}

#some specific files in the web/assets directory. if this matches, it is preferred over the location web/assets because it is more specific
location ~* /web/assets/.*\.(jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
  expires 1M;
  access_log off;
  add_header Cache-Control "public";
  try_files $uri $uri/ @mycache;
}

# CSS and Javascript
location ~* /web/assets/.*\.(css|js)$ {
  expires 1y;
  access_log off;
  add_header Cache-Control "public";
  try_files $uri $uri/ @mycache;
}

タイプミスやエラーがあるかもしれませんが、今はテストする手段がありません。お知らせ下さい

于 2013-11-05T11:54:36.390 に答える