Index: http/modules/ngx_http_proxy_module.c
===================================================================
--- http/modules/ngx_http_proxy_module.c	(revision 405)
+++ http/modules/ngx_http_proxy_module.c	(working copy)
@@ -117,6 +117,9 @@
 static ngx_int_t
     ngx_http_proxy_internal_body_length_variable(ngx_http_request_t *r,
     ngx_http_variable_value_t *v, uintptr_t data);
+static ngx_int_t
+    ngx_http_proxy_cache_age_variable(ngx_http_request_t *r,
+    ngx_http_variable_value_t *v, uintptr_t data);
 static ngx_int_t ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r,
     ngx_table_elt_t *h, size_t prefix);
 
@@ -580,6 +583,11 @@
     { ngx_string("proxy_internal_body_length"), NULL,
       ngx_http_proxy_internal_body_length_variable, 0, NGX_HTTP_VAR_NOHASH, 0 },
 
+#if (NGX_HTTP_CACHE)
+    { ngx_string("proxy_cache_age"), NULL,
+      ngx_http_proxy_cache_age_variable, 0, NGX_HTTP_VAR_NOHASH, 0 },
+#endif
+
     { ngx_null_string, NULL, NULL, 0, 0, 0 }
 };
 
@@ -3052,3 +3060,33 @@
 
     v->uri = u->uri;
 }
+
+#if (NGX_HTTP_CACHE)
+static ngx_int_t
+ngx_http_proxy_cache_age_variable(ngx_http_request_t *r,
+    ngx_http_variable_value_t *v, uintptr_t data)
+{
+    ngx_int_t age;
+
+    if (r->cache == NULL || r->cache->date == 0) {
+        v->not_found = 1;
+        return NGX_OK;
+    }
+
+    v->valid = 1;
+    v->no_cacheable = 0;
+    v->not_found = 0;
+
+    v->data = ngx_pnalloc(r->connection->pool, NGX_TIME_T_LEN);
+
+    if (v->data == NULL) {
+        return NGX_ERROR;
+    }
+
+    age    = r->start_sec - r->cache->date;
+    v->len = ngx_sprintf(v->data, "%T", age) - v->data;
+
+    return NGX_OK;
+}
+
+#endif
