【问题标题】:304 not modified on static files304 未在静态文件上修改
【发布时间】:2015-12-03 04:02:03
【问题描述】:

将项目移至生产服务器后,我发现静态文件(例如图片)不会返回状态“304 未修改”,尽管有“Last-Modified”和“Expires”之类的缓存标题。

请求标头

Accept:image/webp,image/*,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,uk;q=0.2
Cache-Control:max-age=0
Connection:keep-alive
Cookie:_LANG=ru
DNT:1
Host:test.com
If-Modified-Since:Mon, 07 Sep 2015 08:46:37 GMT
If-None-Match:"1D0E949B4DCD480"
Referer:http://test.com/ru/Some/Index/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,     like Gecko) Chrome/45.0.2454.85 Safari/537.36

响应标头

HTTP/1.1 200 OK
Cache-Control: public
Content-Type: image/png
Expires: Tue, 08 Sep 2015 14:33:06 GMT
Last-Modified: Mon, 07 Sep 2015 08:46:37 GMT
Accept-Ranges: bytes
ETag: "1D0E949B4DCD480"
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 07 Sep 2015 14:33:06 GMT
Content-Length: 5953

在本地“IIS express”,一切正常。

本地响应标头

HTTP/1.1 304 Not Modified
Cache-Control:public
Date:Mon, 07 Sep 2015 14:38:12 GMT
Etag:"1D04A9052E17E00"

提示,可能是什么原因?

Web.config 文件完全相同。

谢谢!

UPD 1:

UPD 2:

本地机器缓存快照返回图片

C:\Users\dev>netsh http show cachestate

Snapshot cache responses HTTP::
--------------------------------

URL-address: http://dev2-pc:1437/Views/CustomMeme/byby/img/header.jpg
Status Code: 200
Команда HTTP: GET
Тип политики кэша: Срок жизни (TTL)
Срок жизни записи в кэше (сек): 86399
Время создания: 2015.9.8:12.14.41:0
Имя очереди запросов: Clr4IntegratedAppPool{737BCE3B-FD81-4AB4-B976-A3A8C8A-94D8}
Тип содержимого: image/jpeg
Кодировка содержимого: (null)
Длина заголовков: 415
Длина содержимого: 49017
Число обращений: 3
Принудительное отключение после обслуживания: FALSE

但是远程(生产)服务器缓存快照是空的

C:\Users\Администратор>netsh http show cachestate

Snapshot cache HTTP responses:
--------------------------------
The cache contains entries that match the specified URL-address

【问题讨论】:

  • 很好奇您的请求标头包含Pragma:no-cache。您的浏览器是否设置为在开发者工具打开时禁用缓存?
  • @ChrisCurtis,感谢您的回答,Pragma:no-cache 不影响响应。我更新了问题文本并添加了一些屏幕截图。
  • web.config 一样吗?生产服务器上是否禁用了静态缓存?这涉及到很多变量,理想情况下,静态内容过期必须在 IIS 级别或 web.config 中打开
  • 尝试使用:netsh http show cachestate。这将显示有关当前在缓存中的文件的信息。
  • 我的猜测是这与 ETags 有关。尝试在服务器上禁用它们并检查...

标签: asp.net asp.net-mvc iis iis-8


【解决方案1】:

参考下面的链接并根据您的要求为内容类型手动启用缓存,看看它是否有效。

https://www.iis.net/configreference/system.webserver/caching

【讨论】:

    【解决方案2】:

    据我了解,状态码 304 表示服务器告诉浏览器,“嘿,您请求的图像自 xxxx/xx/xx 以来没有更改,使用本地缓存应该没问题!”。因此,您的开发机器和生产服务器之间的差异很可能是由生产服务器 IIS 设置引起的。

    你现在可以尝试的是:

    • 在您的网络浏览器中“硬重新加载”到您的网页(在 chrome 中,您可以通过单击 F12 打开“开发者工具”,然后右键单击“重新加载”按钮,它会给您“空缓存”和硬重新加载“选项”
    • 在您的开发机器上,尝试安装 IIS 而不是 IIS express,并在 IIS 中运行您的 Web 应用程序。 IIS express 与您的生产服务器 IIS 之间可能存在一些默认设置差异,因此请尝试在您的开发计算机上模拟生产服务器环境
    • 尝试显式禁用 IIS 缓存。你可以在这里找到如何做到这一点https://serverfault.com/questions/117970/iis-7-returns-304-instead-of-200

    希望这会有所帮助! 亨利

    【讨论】:

      猜你喜欢
      • 2012-08-18
      • 1970-01-01
      • 2014-06-06
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      相关资源
      最近更新 更多