我在标头字段方面遇到了问题expires
。以下 nginx 规则给了我这个标头(无过期标头)。知道为什么过期标头没有被传递吗?
标题:/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
以下内容应该可以显示在同一位置块中设置的过期标头...
try_files $uri $uri/ /$1/$2 =404;
根据 Nginx wiki,try_files应该以 URI 或状态代码结尾。如果您启用Nginx 中的调试。
更新:
知道为什么过期标头没有被传递吗?
我启用了调试来弄清楚这个有趣的情况。这是我发现的...
这是之前链接的 try_files wiki 文章的直接引用...
如果没有找到任何文件,则进行内部重定向到最后一个参数指定的 uri。
因此,当您使用以下代码时...
try_files $uri $uri/ /$1/$2;
nginx 找不到(在您的例子中是 /css/v1/afile.css 和 /css/v1/afile.css/),因此会进行内部重定向到最后一个参数中指定的 URI。因此,在内部重定向之后,会找到位置$uri
(在您的例子中是 /css/afile.css),$uri/
/$1/$2
在另一个位置块中。由于它是由另一个没有任何过期时间的位置块执行的,因此您没有看到过期时间。