【问题标题】:htaccess mod_headers for no-cachinghtaccess mod_headers 用于无缓存
【发布时间】:2012-04-22 02:51:05
【问题描述】:

我们有一个应用程序允许用户添加/编辑/替换/删除内容(文本、图像、swfs、mp3 等)。我们希望管理员通过使用无缓存标头始终拥有最新更新的文件,并且当用户运行应用程序时,所有内容都会获取/使用缓存。

我研究了解决方案并尝试使用 html 元标记,例如:

<meta http-equiv="expires" content="0" />
<meta http-equiv="cache-control" content="no-cache, no-store" />
<meta http-equiv="pragma" content="no-cache" />

但这似乎不是一个好的解决方案,因为这发生在创建标头之后并且不会更改媒体(图像、swfs、mp3 等)标头。

我想使用 apache 来设置标题并遇到了 this site 的代码:

<filesMatch "\.(html|htm|js|css)$">
FileETag None
<ifModule mod_headers.c>
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</ifModule>
</filesMatch>

这似乎是一个很好的解决方案,但是我们需要缓存它和不应该缓存它之间的唯一真正区别是 URL(preview.jsp 与 run.jsp),所以我们无法匹配它按文件类型,因为大多数文件都是相同的。

对于这种情况,有人有好的解决方案吗?

谢谢。

编辑:

Preview.jsp和run.jsp基本相同,只是jsp和js处理不同。他们通过 iframe 读取相同的内容和媒体。例如,它们看起来像:

<%
//Some JSP
%>
/* HTML Headers, JS, ETC */
<iframe id="contentFrame" seamless="1" src="http://somedomain.com/template.html"></iframe>
/* End HTML */

preview.jsp 和 run.jsp 出现在同一个目录中并使用所有相同的资源。我正在寻找一种解决方案,让 preview.jsp 不缓存任何东西,而 run.jsp 来缓存东西。

服务器是用 Apache Tomcat 设置的。

【问题讨论】:

    标签: apache jsp caching http-headers mod-headers


    【解决方案1】:

    SetEnvIfHeader 的组合可能会奏效:

    # Image, CSS and JavaScript requests normally contain the Referer header
    # which tells apache which page is requesting the resource
    # Use SetEnvIf directive to set a flag for internal uses
    
    SetEnvIf Referer preview\.jsp force_no_cache
    
    # Header directive optionally accepts env= argument
    # If present, the directive is fired if the flag is set
    
    Header unset ETag env=force_no_cache
    
    # repeat for other headers
    

    【讨论】:

    • 谢谢,看来这行得通。我明天试试看。
    【解决方案2】:

    您可以在 Java servlet 中设置相应的标头。 Apache mod_headers 主要用于由 Apache 管理的静态资源。而应用服务器提供的一切都在 AS 端进行管理。

    通常,您可以为此目的使用过滤器。这是一个例子:http://www.tidytutorials.com/2009/11/adding-headers-to-requests-in-filters.html

    【讨论】:

    • 感谢您的回复。我对jsp相当陌生,所以请与我裸露。以这种方式设置标题会影响页面中的所有媒体吗?这就是为什么你会走这条路而不是简单的“response.setHeader”吗?
    • response.setHeader 仅影响 JSP/Servlet 提供的内容。媒体资源可能(并且应该)具有不同的缓存设置。因此,基本上,您将 Apache 用于具有自己的一组设置的静态资源,而 Java 应用程序仅为 JSP 提供的内容(即页面内容,而不是媒体)设置缓存标头
    • 我的主要问题是媒体(图像、mp3、swf)的缓存,但是因为在某些情况下我需要缓存它们(生产)而其他情况下我不需要缓存它们(开发),我该怎么做呢?
    • 我只是针对不同的环境有不同的配置文件。如果两者都有一个 Apache,那么您可以通过 URL 区分它们(例如,dev url 从 /dev 开始,如 /images/a.png 和 /dev/images/a.png)。不一定有不同的文件夹与图像 - 你可以简单地使用 Apache Rewrite 将它们指向同一个目录。
    • 问题是,相同的环境和相同的 url。所以 somedomain.com/preview.jsp 和 somedomain.com/run.jsp 都设置相同,只是处理不同。它们每个都有一个 iframe,其中包含 somedomain.com/template.html,例如可能包含 somedomain.com/image/1.jpg 和 somedomain.com/image/2.jpg。您是说将所有预览媒体的 url 和链接更改为另一个目录并使用 apache 设置为不缓存并重定向回同一目录吗?这些模板的 iframe 中会发生什么?您是否有任何工作示例可以帮助您走上正轨?
    猜你喜欢
    • 2012-04-13
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多