
ヘッダー フィールドに問題がありますexpires
。次の nginx ルールでは、このヘッダー (expire ヘッダーなし) が提供されます。expires ヘッダーが渡されない理由は何でしょうか?
ヘッダー: /css/v1/afile.css
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 14 Sep 2013 07:29:59 GMT
Content-Type: text/css
Content-Length: 12548
Last-Modified: Sat, 11 May 2013 11:05:51 GMT
Connection: keep-alive
Accept-Ranges: bytes
Nginx 設定:
server {
listen 80 default_server;
server_name _;
root /var/www/apps/myapp/public/app/webroot;
index index.php index.html index.htm;
server_tokens off;
access_log /var/www/apps/myapp/logs/access.log;
error_log /var/www/apps/myapp/logs/error.log;
client_max_body_size 20M;
rewrite_log on;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ /(js|css)/v[0-9]+/(.*) {
access_log off;
expires 7d;
add_header Cache-Control public;
try_files $uri $uri/ /$1/$2;
}
# Pass the PHP scripts to FastCGI server
location ~ \.php$ {
fastcgi_pass backend;
fastcgi_index index.php;
fastcgi_intercept_errors on; # to support 404s for PHP files not found
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
答え1
同じ location ブロックに設定された expires ヘッダーを表示するには、次のようにします...
try_files $uri $uri/ /$1/$2 =404;
Nginx wikiによると、試すファイルURIまたはステータスコードで終わる必要があります。有効期限が設定されていない理由の詳細については、Nginx でのデバッグ。
アップデート:
有効期限ヘッダーが渡されない理由は何でしょうか?
この興味深い状況を理解するためにデバッグを有効にしました。これが私が見つけたものです...
以下は、先ほどリンクした try_files wiki 記事からの直接引用です...
ファイルが見つからなかった場合、最後のパラメータで指定された URI への内部リダイレクトが行われます。
したがって、次のコードを使用すると...
try_files $uri $uri/ /$1/$2;
nginx は見つけることができず$uri
($uri/
あなたの場合 /css/v1/afile.css と /css/v1/afile.css/)、最後のパラメータで指定された URI への内部リダイレクトが行われます。したがって、内部リダイレクトの後、場所/$1/$2
が見つかります (あなたの場合 /css/afile.css)。別の場所ブロック有効期限のない別のロケーション ブロックによって実行されるため、有効期限は表示されません。