Php 浏览器如何决定何时再次请求缓存文件?

Php 浏览器如何决定何时再次请求缓存文件?,php,html,performance,caching,server,Php,Html,Performance,Caching,Server,我有一个网页,我正在缓存12小时。这是响应标题的两个屏幕截图 及 正如您所看到的,“日期”和“到期”标题的值都已更改。我的理解是,“日期”是指我们请求文件的时间,“过期”是指浏览器应该检查更新版本的时间。间隔四分钟后,两个值都已更新。那个么,浏览器如何决定何时请求文件的更新版本呢?它不会导致文件无限期缓存吗 我知道“Expires”值只是对浏览器的建议。但浏览器如何知道文件第一次被请求的时间,因为“Date”头也会每次更新 我还有一个问题。我的网页有.php扩展名。但是,我的标题显示: Co

我有一个网页,我正在缓存12小时。这是响应标题的两个屏幕截图

正如您所看到的,“日期”和“到期”标题的值都已更改。我的理解是,“日期”是指我们请求文件的时间,“过期”是指浏览器应该检查更新版本的时间。间隔四分钟后,两个值都已更新。那个么,浏览器如何决定何时请求文件的更新版本呢?它不会导致文件无限期缓存吗

我知道“Expires”值只是对浏览器的建议。但浏览器如何知道文件第一次被请求的时间,因为“Date”头也会每次更新

我还有一个问题。我的网页有
.php
扩展名。但是,我的标题显示:

Content Type : "text/html"

为什么会这样<代码>内容类型:“text/html”导致缓存我的网页。缓存不会发生在具有
会话\u start()
的页面上?这是因为
会话\u start()
还是只是巧合?

仅回答第二部分

Php页面动态创建html页面,然后发送给客户端。对于客户端来说,它只是html

  • HTTP“Date”头只是服务器上的当前日期和时间。有关更多详细信息,请参阅。它与所服务的资源(文件/页面)没有任何关系

  • HTTP“Expires”头是针对浏览器的建议,通常在web服务器配置中或直接在应用程序代码中设置。在大多数情况下,它是当前时间+一些额外的小时/天,这是网站管理员认为合理的。所以,如果expiration设置为3天——“Expires”将始终在“Date”字段中显示当前时间,在“Expires”字段中显示当前时间+3天。文件何时更新并不重要,它没有效果

  • 如果您的浏览器缓存了此文件,但原始“过期”时刻尚未到来,则浏览器将使用缓存的版本。不过,有一些方法可以强制更新

  • 如果您的PHP输出HTML(在许多情况下都是如此),则“text/HTML”的内容类型是完全正确的。它可以是‘application/json’、‘image/png’以及其他任何合适的名称。PHP是编程语言,内容类型是指从HTTP服务器接收的数据的格式,它可以是任何东西

  • 日期和过期标题来自服务器。如果所服务的资源具有明确的日期(例如,它是磁盘上的实际文件,或者它是设置日期头的脚本),则服务器将使用该日期。否则,服务器将使用当前日期

    如果上载新文件,浏览器通常不会再次从服务器请求资源,而该文件的浏览器缓存仍然有效。如果用户清除缓存或强制刷新,则浏览器将查询服务器并接收更新的内容

    请注意,缓存到期标头是建议性的。浏览器可以随时重新请求任何资源。(但出于性能原因,浏览器通常会尽可能长时间地缓存任何内容。)


    默认情况下,PHP提供的任何页面都将具有
    内容类型:text/html
    。这是正常的。当然,PHP代码可以将其更改为任何其他内容,并且通常在PHP提供非html内容时都会这样做


    任何使用会话的页面通常都不会被缓存。这也是正常的。这样做的原因是,通常情况下,页面内容取决于会话数据(例如,当前登录的用户),缓存是不可取的



    对于您更新的问题:发生的情况是,您正在强制重新加载网页(从服务器)。因此,当它这样做时,服务器将向它提供更新的信息。当您告诉浏览器重新加载(而不仅仅是转到页面)时,您明确地告诉它忽略缓存并重新请求资源。这就是为什么您的日期和过期标题看起来是向前的。

    所以应用于
    .html
    的任何
    .htaccess
    规则都适用于
    .php
    文件?我不相信这种情况。他们收到的是html,但发送给处理.htaccess的服务器却不一样。如果你不想缓存页面,你可以发送相应的
    缓存控制
    标题。如果文件没有缓存,日期和过期标题是否仍然来自服务器?@sanjeething实际上,服务器总是会发送一个日期。服务器是否发送Expires标头完全取决于配置。请您也回答我提到的第二部分,
    .php
    没有
    session\u start()
    的页面被缓存,而没有
    session\u start()的页面被缓存
    不会被缓存。为什么会发生这种情况?如果浏览器不断更新日期标头,并且文件将在上次请求后12小时过期。这会导致文件无限期缓存吗?我遗漏了什么吗?更新了。此外,浏览器不设置日期标题。服务器提供日期和过期标题。只要服务器和客户端的时钟设置正确,您就不会意外地无限期缓存某些内容。如果浏览器将“Expires”字段设置为当前时间+3天,是否会导致文件无限期缓存。我错过什么了吗?当然不会!3天后,浏览器将下载新副本,如果文件已更新,浏览器将获得更新的文件。它与DNS中的TTL字段类似,这意味着保存文件的时间是多少,而不是认为它过时了。因此,“日期”和“过期”字段中的值不重要?浏览器将始终在三天后请求更新版本