【问题标题】:Modifying the HTTP headers client-side with JavaScript使用 JavaScript 在客户端修改 HTTP 标头
【发布时间】:2009-08-06 04:43:37
【问题描述】:

是否可以使用 JavaScript 动态更改从外部源加载图像时收到的 HTTP 标头?我正在尝试控制客户端的图像缓存(Expires、Max-Age 等...),因为我无权访问服务器。

【问题讨论】:

  • 这与编程无关? (这听起来很奇怪,通常情况正好相反......)
  • @Kobi: 我为此修改了问题(为了清楚起见)。

标签: javascript caching http-headers


【解决方案1】:

正如其他人所说,不,不可能在客户端代码中操纵来自服务器的 http 标头和缓存指令。

什么是可能的

你有能力做的是确保你得到一个新文件。这可以通过将唯一字符串附加到请求的 URL 作为查询字符串参数来完成。

例如如果你想确保每小时都有一个新文件

<script type="text/javascript">

var d = new Date();
url += ("?" +d.getYear() + "_" + d.getDay() + "_" + d.getHours());

</script>

这样做是在 url 中添加一个包含年、日和小时的值,因此它对于每个小时都是唯一的,从而确保新的文件请求。 (未经测试!)

显然,这可以变得更加通用和微调,但希望您能明白这一点。

什么是不可能的

您不能做的是确保您不会从服务器检索新版本。

【讨论】:

  • 另一个注意事项:如果您根本不想缓存,可以使用d.getTime(); 作为时间戳,这将附加一个数字,例如1249547501178
【解决方案2】:

缓存指令由服务器负责。你不能在客户端操作它们。

也许您可以选择安装代理服务器,例如如果你的目标是公司员工?

【讨论】:

    【解决方案3】:

    我认为 Javascript 不能真正做到这一点:图像是由浏览器请求的,由他来定义要发布的 HTTP 标头。

    使用某些自定义标头的一种方法是使用某种 Ajax 请求,而不是通过任何 &lt;img&gt; 标签传递;但是您必须知道如何处理返回的数据...不要认为它有多大帮助。

    如果您希望您的图像被浏览器保存在缓存中,您的服务器必须在响应中发送正确的标头(例如 Etag 和/或 Expires - 参见 mod_expires,例如对于 Apache )

    如果您想绝对确定浏览器会下载新图像,而不是使用缓存中的版本,则每次都应使用不同的 URL。
    这通常使用时间戳作为 URL 的参数来完成;比如 example.com/image.jpg?123456789 (123456789 或多或少是当前时间戳——显然少于更多,但你明白了:每一秒,浏览器都会看到 URL 发生了变化)


    编辑问题后编辑:

    Expires 标头由服务器生成,是响应中的标头之一(它不是客户端在请求中发送的标头;请参阅List of HTTP headers)。

    因此,您绝对无法从客户端控制它:必须配置服务器才能完成工作,这里...


    如果您想要更多答案:您到底想做什么?为什么?

    【讨论】:

    • 想要使用客户端技术而不是服务器(tomcat、apache)通过 ajax 为从外部源到客户端的图像/闪存提取设置更长的过期时间
    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 2014-10-16
    • 2017-01-19
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2016-05-23
    相关资源
    最近更新 更多