内容类型文本/HTML 未缓存
Posted
技术标签:
【中文标题】内容类型文本/HTML 未缓存【英文标题】:Content-Type Text/HTML is not cached 【发布时间】:2016-01-09 23:38:50 【问题描述】:我有一个简单的情况。我正在使用 jQuery 的 ajax 方法来获取一些数据。
当我在 url 中引用“api.json”时,我会得到带有 etag、缓存控制等的正确响应头。内容类型也是“application/json”
但是当我在url中引用一个“api.php”时,响应头发生了变化,这次没有etag,没有cache-control,content-type也是“text/html”(可以理解)。
在该 php 文件中,返回的数据使用 json_encode() 正确格式化。
我不明白的是,为什么 etag 和其他缓存标头行为不端?
我怎样才能让它们正确缓存?
【问题讨论】:
Apache 或您使用的任何 Web 服务器可能会基于每个文件类型设置标头。也许它们只为 .json 结尾设置,或者为 .php 结尾被覆盖。 设置你想要的合适的标题 任何提示或链接如何? PHP 脚本默认不设置缓存头 - 这是有道理的,因为通常它们的输出 是 动态的并且经常更改。如果您想通过 PHP 脚本缓存内容输出的标头,您必须自己实现。 (但是你还必须自己实现对相应请求头的检查 - 否则脚本将照常运行,返回所有内容,并再次发送 200 状态码。) 【参考方案1】:客户端代码将无法访问跨域响应中的 ETag 标头,除非服务器在其响应中包含 Access-Control-Expose-Headers 标头,其值为“ETag”。任何“非简单”响应标头都是如此。
来自CORS
7.1.1 处理对跨域请求的响应 用户代理必须过滤掉所有响应头,除了那些是简单响应头或字段名称是 ASCII 大小写不敏感匹配值之一的响应头Access-Control-Expose-Headers 标头(如果有),然后将响应标头公开给 CORS API 规范中定义的 API。
简单的响应标头仅限于:
-
缓存控制
内容-语言
内容类型
过期
最后修改
编译指示
客户端需要在响应中访问的所有其他标头必须通过我上面提到的响应标头“公开”。
【讨论】:
感谢您指出这一点,但我的问题仍未解决。我使用了header("Access-Control-Expose-Headers: ETag");
,但它只是在标题中输出同一行,而不是原始的 etag 标题。以上是关于内容类型文本/HTML 未缓存的主要内容,如果未能解决你的问题,请参考以下文章
内容未加载,因为它的 MIME 类型“text/html”不是“text/css”
AFNetworking 2.0:NSLocalizedDescription=请求失败:不可接受的内容类型:文本/html
“请求失败:不可接受的内容类型:文本/html”使用 AFNetworking 2.0