【问题标题】:PHP Header - Location Redirect seems to lose cachingPHP Header - 位置重定向似乎失去了缓存
【发布时间】:2011-10-03 19:40:05
【问题描述】:

在将请求重定向到不同主机之前,我正在对文件的响应代码进行一些 cURL 检查(以确保在我重定向之前文件存在)。

当我们都很高兴时,我将它们从服务器发送到远程主机,我们都很高兴。

唯一的问题似乎是它没有缓存在用户的机器上。我可以做些什么让用户浏览器知道这是同一个文件吗?我认为它天生就知道,因为它只是一个标头位置重定向(即标头('location:http://www.locationtogo.com/asda?242');

感谢您的帮助!

------- 更新 ----------

这方面的问题似乎不少;所以让我一步一步解释......

  1. 用户从 handler.php 请求文件
  2. handler.php 执行 cURL 检查以查看响应代码是否为
  3. 如果响应代码是 200 我正在重定向到文件
  4. 但是每次都为同一个文件重新加载 handler.php...它会重新加载整个文件

我现在意识到 - 愚蠢的错误 - 但会在这里列出以防万一有人遇到同样的情况 - 我当然是在寻找响应 200,而不是 200 或 304。

现在正在缓存。

【问题讨论】:

  • 不确定我是否理解问题所在。什么不是缓存在哪里以及正在发生什么?
  • 请重新阅读您的问题。对我来说,尤其是最后一部分还不清楚。谁缓存什么,什么不缓存?应该缓存什么?什么不应该被缓存?什么是一样的(听起来好像不一样)?
  • 我现在已经对此进行了排序 - 这是我自己的错误。我希望这也可以逐步清除。

标签: php caching browser redirect header


【解决方案1】:

您需要在重定向的同时添加Cache-ControlExpires 标头以表明它可以被缓存。

示例(这将允许浏览器将响应缓存一小时)

header('Cache-Control: max-age=3600')

【讨论】:

  • PHP/Apache 仍然不会缓存文件,除非您自己返回 304。
  • PHP/Apache 不需要(也不能)缓存文件。浏览器被重定向到该位置并将下载文件本身。 Apache/PHP 永远不会读取文件(当然,除非被重定向到的文件是同一台服务器)。
【解决方案2】:

默认情况下,PHP 和 apache 不会缓存 PHP 文件。我最近自己遇到了这个。但是,您可以根据需要返回 304,这将解决问题。我是用 etags 做的。

只需在浏览器第一次访问时发送 etag 哈希。

header('Etag: '.$eTagHash);

然后,检查 etag 是否存在,如果存在则告诉浏览器这是未修改的 304。

if(isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
    if(trim($_SERVER['HTTP_IF_NONE_MATCH']) == trim($eTagHash)){
       header("HTTP/1.1 304 Not Modified");
       exit;
    }}

您可以将 $eTagHash 设置为您想要的任何内容。您也应该在 apache 服务器上启用 etags(大多数都这样做)。

如果您需要重定向到其他地方,只需更改 etag 哈希,当它不匹配时,您可以使用新值再次向浏览器发送标头 etag。

【讨论】:

  • 这适用于缓存脚本的输出。不重定向。重定向需要 302 状态代码。
  • 假设他想发送一个 302 代码。他解释说该文件没有被缓存。对我来说,这听起来像是他使用 HTML 文件来重定向而不是标题。如果他使用标头缓存永远不会成为问题,因为服务器重定向在响应标头中而不是在 HTML 正文中,因此无论如何问题将完全无效。显然他在问浏览器的“缓存”。
  • 他正在使用问题中所述的标头重定向“我认为它本质上会知道,因为它只是标头位置重定向(即标头('location:locationtogo.com/asda?242');”
猜你喜欢
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多