Nginx:过期标头不起作用

Nginx:过期标头不起作用

我在标头字段方面遇到了问题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在另一个位置块中。由于它是由另一个没有任何过期时间的位置块执行的,因此您没有看到过期时间。

相关内容