Google App engine always generates 200 for the url /test.js and test.js is not a static resource, but a url pattern for dynamically generated content. The content will expire after N hours and a fresh content will be generated.
I've tried with Last-Modified, ETag and Cache-Control. None seems to work.
Request
Request URL:http://localhost:8081/test.js Request Method:GET Status Code: 200 OK Accept:*/* Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en;q=0.8 Cache-Control:max-age=0 Connection:keep-alive Host:localhost:8081 If-Modified-Since:Fri, 18 Oct 2013 14:10:39 GMT If-None-Match:"1B2M2Y8AsgTpgAmY7PhCfg" Referer:http://localhost:8080/ User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
Response Headers
cache-control:public, max-age=360000 Content-Length:2 content-type:application/script; charset=utf-8 Date:Fri, 18 Oct 2013 14:10:40 GMT etag:"1B2M2Y8AsgTpgAmY7PhCfg" expires:Tue, 22 Oct 2013 18:10:40 GMT last-modified:Fri, 18 Oct 2013 14:10:40 GMT Server:Development/2.0
Refer to this for HTTP status: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
200 is just the correct HTTP OK status, that doesn't have any interpretation on whether the resource is static or not. (Try any dynamic web page out there like e.g. facebook) and you will notice it's 200. Having a response of 200 is perfectly normal
for 304 it's "Not Modified" - As mentioned in w3 "The 304 response MUST NOT contain a message-body". This is not what you want.
In your case your concern should be to set the correct expiry time for these http header (do it within your program code), so that the browser always request for a fresh copy of content after the expiry time (e.g. after 1 hour):
Your request has
Cache-Control:max-age=0
, so any intermediate caches (incl. the browser-cache) won't serve cached content. This is likely a result of a setting in your browser.For requests with revalidate headers (
If-X
), you need to have the logic in place to act properly. To save bandwidth, this is pretty simple with webob (which is used by webapp2 and other frameworks) and the conditional-response setting. Avoiding computation as well depends a little more on what you're doing, but webob helps here too.Redbot is a really useful tool for checking HTTP cache behaviour.