2.5w+
社区成员
295 if (expires == NGX_HTTP_EXPIRES_EPOCH) {
296 e->value.data = (u_char *) "Thu, 01 Jan 1970 00:00:01 GMT";
297 ngx_str_set(&cc->value, "no-cache");
298 return NGX_OK;
299 }
300
301 if (expires == NGX_HTTP_EXPIRES_MAX) {
302 e->value.data = (u_char *) "Thu, 31 Dec 2037 23:55:55 GMT";
303 /* 10 years */
304 ngx_str_set(&cc->value, "max-age=315360000");
305 return NGX_OK;
306 }
这几个值在 head 加入之后的具体作用可参考 http 协议 .
至于具体情况可参见所列出的源代码 .
至于其它的 , 例如 Last-Modified , Etag , 等 , 可以参见源代码的 77-90 行 , 顺着去找答案 .
--------------------------------------------------------------------------------------------------------------
另外 , expires 的配置在源代码中的段列出一下
ngx_command_t 配置结构体为 :
static ngx_command_t ngx_http_headers_filter_commands[] = {
{ ngx_string("expires"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_TAKE12,
ngx_http_headers_expires,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL},
{ ngx_string("add_header"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_TAKE23,
ngx_http_headers_add,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL},
ngx_null_command
};
可见这个 expires 可以接受 1 个或两个参数 . 看看它的配置处理函数 : ngx_http_headers_expires
在两个参数的情况下 , 第一个参数必须为 modified , 至于两个参数在什么情况下用 , 我没用过 . 源代码中有对于参数的如下判断 ( 带行数复制) :
static char *
603 ngx_http_headers_expires(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
604 {
..............................................................................
619
620 if (cf->args->nelts == 2) {
621
622 hcf->expires = NGX_HTTP_EXPIRES_ACCESS;
623
624 n = 1;
625
626 } else { /* cf->args->nelts == 3 */
627
628 if (ngx_strcmp(value[1].data, "modified") != 0) {
629 return "invalid value";
630 }
631
632 hcf->expires = NGX_HTTP_EXPIRES_MODIFIED;
633
634 n = 2;
635 }
..............................................................................
666 return NGX_CONF_OK;
667 }
......................................................................................................................................
以上是我的简略分析 , nginx 的 expires 完全是依靠浏览器的 , 也就是说这个指令在服务端没有任何缓存的用意 , 但是浏览器本生有 304 ( 参考 http 协议 ) , 所以它对 304 给予了支持 . 我觉得这也是最有效的缓存 . 效果好 , 而且不要钱 .
而反向代理缓存么 , (ngx_cache_purge, squid , 商业化 CDN 服务等等 ) , 是存在服务器端的而非浏览器端 . 如 cdn ,一次请求之后,它会把你的文件“下载”到它 cdn 的服务器,再次有请求过来时,便不会从你的服务器里去取文件,而是从 cdn 节点服务器直接返回已经缓存的文件 .
location ~ .*\.(gif|jpeg|png|bmp|js|css)$
{
expires 12h;
}
我只知道这样配置,图片,js,css,就能在浏览器端缓存12小时(天就改成d),可以用chrome 的调试工具查看network查看,会有 from cache的提示
效果更好的话,可用cdn,图片的话,用七牛云也是不错的选择
内存充足的话,就用memcached或是redis这样的内存缓存