Php 未缓存内容类型Text/HTML

Php 未缓存内容类型Text/HTML,php,jquery,json,ajax,Php,Jquery,Json,Ajax,我有一个简单的情况。我正在使用jQuery的ajax方法来获取一些数据 当我在url中引用“api.json”时,我会得到带有etag、缓存控制等的正确响应头。内容类型也是“application/json” 但是当我在url中引用“api.php”时,响应头会发生变化,这次没有etag,没有缓存控制,内容类型也是“text/html”(这是可以理解的) 在该php文件中,返回的数据使用json_encode()正确格式化 我不明白的是,为什么etag和其他缓存头行为不正常 如何使它们能够正确缓

我有一个简单的情况。我正在使用jQuery的ajax方法来获取一些数据

当我在url中引用“api.json”时,我会得到带有etag、缓存控制等的正确响应头。内容类型也是“application/json”

但是当我在url中引用“api.php”时,响应头会发生变化,这次没有etag,没有缓存控制,内容类型也是“text/html”(这是可以理解的)

在该php文件中,返回的数据使用json_encode()正确格式化

我不明白的是,为什么etag和其他缓存头行为不正常


如何使它们能够正确缓存?

客户端代码将无法访问跨源响应中的ETag头,除非服务器在其响应中包含一个值为“ETag”的访问控制暴露头。这适用于任何“非简单”响应头

7.1.1处理对跨源请求的响应用户代理必须过滤掉所有响应头,而不是简单响应头或字段名为ASCII不区分大小写匹配的响应头,以匹配访问控制暴露头(如果有)的一个值,在向CORS API规范中定义的API公开响应头之前

简单响应标头仅限于:

  • 缓存控制
  • 内容语言
  • 内容类型
  • 到期
  • 最后修改
  • 布拉格马

  • 客户端需要在响应中访问的所有其他头必须通过上面提到的响应头“公开”。

    客户端代码将无法访问跨源响应中的ETag头,除非服务器在其响应中包含一个值为“ETag”的访问控制公开头。这适用于任何“非简单”响应头

    7.1.1处理对跨源请求的响应用户代理必须过滤掉所有响应头,而不是简单响应头或字段名为ASCII不区分大小写匹配的响应头,以匹配访问控制暴露头(如果有)的一个值,在向CORS API规范中定义的API公开响应头之前

    简单响应标头仅限于:

  • 缓存控制
  • 内容语言
  • 内容类型
  • 到期
  • 最后修改
  • 布拉格马

  • 客户机需要在响应中访问的所有其他头必须通过我上面提到的响应头“公开”。

    Apache或您正在使用的任何web服务器可能会根据每个文件类型设置头。可能它们只为.json结尾设置,或者为.php结尾覆盖。如何设置您想要的适当标题提示或链接?php脚本默认情况下不设置缓存标题,这很有意义,因为它们的输出通常是动态的,并且经常更改。如果希望通过PHP脚本缓存内容输出的标题,则必须自己实现。(但是您还必须自己执行相应请求头的检查——否则脚本将像往常一样运行,返回所有内容,然后再次发送200状态码。)Apache或您正在使用的任何web服务器可能会根据每个文件类型设置头。可能它们只为.json结尾设置,或者为.php结尾覆盖。如何设置您想要的适当标题提示或链接?php脚本默认情况下不设置缓存标题,这很有意义,因为它们的输出通常是动态的,并且经常更改。如果希望通过PHP脚本缓存内容输出的标题,则必须自己实现。(但是,您还必须自己执行相应请求头的检查——否则脚本将像往常一样运行,返回所有内容,然后再次发送200状态码。)感谢您指出这一点,但我的问题仍然没有解决。我使用了
    标题(“访问控制公开标题:ETag”)但它只是在标题中输出相同的行,而不是原始etag标题。感谢您指出这一点,但我的问题仍然没有解决。我使用了
    标题(“访问控制公开标题:ETag”)但它只是在标题中输出相同的行,而不是原始etag标题。