3

一部のコンテンツがユーザーによって生成される PHP Web サイトがあります。たとえば、ユーザーは写真をアップロードしてサイズを変更し、リクエストすることができます。nginx 構成で MIME タイプ (応答ヘッダー) にExpires基づいてヘッダー (キャッシュ用) を指定したいと思います。Content-Type

これは私の現在の構成です (私のホストは自動的に と を追加http{}しますserver{}):

charset utf-8;

types {
    text/css            css;
    text/javascript     js;
}

gzip on;
gzip_types text/html text/css text/javascript application/json image/svg+xml;

location / {
    if (!-e $request_filename) {
        rewrite  .  /index.php last;
        break;
    }


    set $expire 0;

    if ($upstream_http_content_type = image/jpeg) { set $expire 1; }
    if ($upstream_http_content_type = image/png) { set $expire 1; }
    if ($upstream_http_content_type = image/gif) { set $expire 1; }
    if ($upstream_http_content_type = image/svg+xml) { set $expire 1; }
    if ($upstream_http_content_type = text/css) { set $expire 1; }
    if ($upstream_http_content_type = text/javascript) { set $expire 1; }

    if ($expire = 1) {
        expires max;
    }
}

これは静的ファイル (.pngファイルのように、適切なExpiresヘッダーを取得する) では機能しますが、動的に生成されたコンテンツindex.php(Expiresヘッダーがまったくない) には影響しません。誰かが私が間違っていることを知っていますか?

4

1 に答える 1

1

ブロックには、locationリクエストをphp Webアプリに渡す場所がないため、たとえば次のlocationようなブロックで、別の場所でそれを行うと想定できます。

location /index.php {
   # your code
}

存在する静的ファイルに対するユーザー要求が設定されている場合、最初のifディレクティブは計算されず、すべてがうまくいきます。ifユーザーが動的ファイルを要求し、nginx が最初のブロックに入ると、問題が発生します。

if (!-e $request_filename) {
    rewrite  .  /index.php last;
    break;
} 

そして、ここで何が起こったのですか?lastディレクティブでフラグを使用していますがrewrite、これについてnginxのドキュメントは何を言っていますか?

last - 現在の書き換えディレクティブの処理を完了し、使用可能なすべての場所から URI の一致を検索してプロセス (書き換えを含む) を再開します。

この仕様によると、ファイルが動的に書き換えられindex.php、実行がifブロックを離れ、ブロック全体locationとチェックのための次のifブロックcontent-typeさえもチェックされません。location私はそれがURLを見つけて/index.php、そこに設定していないと思いますexpires max

この問題の説明を理解していますか?

ifこれに対する解決策は、チェックのためにシーケンシャルブロックを移動/コピーして、構成content-typeが実行をphp Webアプリ(index.php)に渡す場所に配置することです...または、他の問題が発生しない場合はディレクティブlastからフラグを削除します。rewrite

わかりましたので、conf ファイルを少し修正すると約束したように、locationブロックを次の 2 つに変更します。

location /index.php {
   if ($upstream_http_content_type ~ "(image/jpeg)|(image/png)|(image/gif)|(image/svg+xml)|(text/css)|(text/javascript)") {
      expires max;
   }
   if ($sent_http_content_type ~ "(image/jpeg)|(image/png)|(image/gif)|(image/svg+xml)|(text/css)|(text/javascript)") {
      expires max;
   }
}

location / {
   if ($upstream_http_content_type ~ "(image/jpeg)|(image/png)|(image/gif)|(image/svg+xml)|(text/css)|(text/javascript)") {
      expires max;
   }
   if ($sent_http_content_type ~ "(image/jpeg)|(image/png)|(image/gif)|(image/svg+xml)|(text/css)|(text/javascript)") {
      expires max;
   }
   try_files $uri /index.php =404;
}
  

最初locationのブロックはindex.php動的応答用で、2 番目のブロックは静的ファイル用です。2 つ目では、ヘッダーをアップストリーム ヘッダーおよび標準ヘッダーとして追加expires maxします (念のため)。ここifでは、構成で正規表現パターン一致を使用して定義したすべてのタイプに対して 1 つのブロックを使用します。最後にtry_filesディレクティブを使用します。これは、url に基づいて静的ファイルを取得できる場合に取得され、別の方法で url /index.php を試すか、http 404 で戻ることを意味します。最初のロケーション ブロックは url のみです/index.phprootアプリケーションのルート フォルダーを指す必要があるconfig ディレクティブのどこにも見つかりませんでした。これも追加してみてください(root doc)。

于 2013-01-31T17:58:46.350 に答える