我已经阅读了很多关于如何自动编辑CSS/JS文件的文章 - 但是这些都没有提供在ASP.NET MVC中执行此操作的优雅方法.
此链接 - 如何强制浏览器重新加载缓存的CSS/JS文件? - 为Apache提供解决方案 - 但我有点困惑如何通过ASP.NET MVC实现这一点?
是否有人能够提供一些如何在IIS7和ASP.NET MVC上执行此操作的建议 - 以便CSS/JS文件自动在URL中插入版本号而不更改文件的位置?
也就是说,所以链接出来链接这个等大概是使用URL Rewrite或?
<link rel="stylesheet" href="/css/structure.1194900443.css" type="text/css" />
<script type="text/javascript" src="/scripts/prototype.1197993206.js"></script>
Run Code Online (Sandbox Code Playgroud)
谢谢
我正在研究一个中等规模的Web应用程序,并尝试提出最佳解决方案,使所有浏览器都使用缓存,并且只在加载资产有更新时才使其无效.
根据我在这里和其他地方所做的研究,每个人似乎都同意将?v = {version#}附加到资产(如css或js文件)是一种在资产时自动使缓存无效的好方法已更新.(根据Force浏览器清除缓存和更好的方法来阻止JavaScript文件的浏览器缓存)
但在我看来,这个解决方案应该推广到驻留在Web服务器上的所有资产.
所以我的问题是,让构建脚本查看整个网站的每个src =""属性是一个好习惯 - 无论是img,css还是js,并以编程方式附加?= {timestamp}其中timestamp是上次修改文件的时间.这样,无论何时从开发到分段再到生产,只有那些已修改的文件才会有更改的时间戳,浏览器将知道这些文件的缓存无效.
有这种方法的任何缺陷?
注意:考虑到这一点,在稍后还原的更改的情况下,时间戳肯定是不合需要的.因此,附加?= {md5(filecontents)}是一种更强大的方法.然而,关于是否在所有资产和所有构建中实现此问题的问题仍然存在.
根据这里的问答,我想为在JBoss 5中运行的Web应用程序实现类似的自动版本系统.有什么东西可以用来做这种事情,还是我需要自己写一些东西?要明确:我没有使用PHP.
不太了解PHP,我不确定PHP的Tomcat/JBoss类似物.htaccess是什么.如果我必须编写自己的自动版本,我会从哪里开始?原理很清楚 - 使用文件的时间戳重写URL,但我不太了解使用JBoss/Tomcat进行URL重写.
1.自定义<my:script/>和<my:style/>标签,所以我不必在<c:url/>任何地方看到标签.
<%@ tag body-content="empty" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ attribute name="src" required="true" rtexprvalue="true" %>
<script src="<c:url value="${src}" />"></script>
Run Code Online (Sandbox Code Playgroud)
2.相当紧随新手的步骤,但映射UrlRewriteFilter到/*在web.xml中:
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
3.向每个新会话(或多或少......)注入CACHE_BUST变量,应用程序部署 timestamp:
// On application deploy:
long CACHE_BUST = System.currentTimeMillis() / 1000;
// later...
session.setAttribute("cacheBust", CACHE_BUST);
Run Code Online (Sandbox Code Playgroud)
4. ...so that I can use these rules in urlrewrite.xml …
我正在编写一个移动网页,该网页同时具有重定向和指向Facebook Page的两个手动备份链接(当重定向不起作用时)。
链接采用以下形式:
fb://page/[PAGE ID NUMBER]
Run Code Online (Sandbox Code Playgroud)
重定向和链接在Chrome Mobile和Firefox Mobile中有效,但是(惊奇)它们在Facebook Browser中不起作用,这反而给了我错误:
Page can't be loaded.
Run Code Online (Sandbox Code Playgroud)
我感到困惑的是,在Facebook浏览器中无法链接到Facebook App。
我该如何解决?是否有任何创造性的解决方案或解决方法...或者我错过了明显的事情?
附加信息:它看起来像重定向是在对Facebook的浏览器中的至少一个工作版本Facebook的iOS应用。因此,该问题可能与Facebook Android App无关。
我已经取得了一些进展。我发现Facebook的应用内浏览器并不总是(或从来没有?)确认/加载/执行外部脚本文件。
在这种情况下,页面加载后,外部脚本href将使用fb://协议链接重新填充链接中的属性。
我已经将相关的javascript函数从外部脚本移到了实际页面的底部。我已经测试了这些功能,并且可以看到它们正在激活。尽管链接仍然无法正常工作。
令我吃惊的是,幕后可能存在某种安全机制,该机制不允许任何由javascript驱动的href属性重新填充,并且代替fb://协议链接不起作用,可能是初始的,默认的http://www.facebook.com/链接甚至从未被替换过,正是那些 http://协议链接不起作用。
因此,我更新了PHP模板,以初始的默认链接fb://代替了http://链接(因此,传递给Facebook应用内浏览器的页面中的任何内容都无需随时由任何客户端脚本进行更新) 。
不。还是行不通。
我在页面底部添加了一个普通的香草链接,链接到该网站的主页。链接完全正常运行。
后来,我指出了指向外部域的原始链接。他们没有工作。
所以...我得出的结论是,只有 http://指向同一域的协议链接才起作用,这就是为什么如果链接指向外部域或fb://协议地址,则它们将不起作用的原因。
结论错误。
我将原始链接指向该网站的首页,但仍然无法正常工作。
很快,我删除了对外部脚本的引用,该脚本是为自定义OS +浏览器环境的链接而设置的(尽管根据FB Debugging工具,此脚本引用已被Facebook完全忽略了)。
链接有效。
因此,我之前添加的普通香草链接起作用的原因与它所指向的位置无关,而仅与脚本从未尝试访问或更新它的事实有关。
我将原始链接指向外部域。他们工作了。
我将原始链接指向了fb:// …
可能重复:
App_Theme文件夹中的CSS在浏览器中缓存
我已经看到" 强制浏览器重新加载缓存的CSS/JS文件的优雅方法是什么? "但答案是使用PHP,并没有解决CSS由ASP.Net主题动态注入的事实.
使用中的答案,建议这个问题,以及本文它提供了一个几乎相同的解决方案,我一直在试图建立的htaccess来处理我的js和css文件自动版本化的规则.
我想这样做的原因是,我改变他们了不少,但还是希望他们能够通过积极长时间浏览器缓存,而不必每次都改变时手动输入一个新的版本号.
使用的方法很简单:(1)一个函数在模式上使用它们被更改的日期将文件编号附加到文件[filename].[version_number].[suffix],因此style.css,例如,将变为style.1300638388.css; (2)使用php,版本号包含在我网站页面的样式表声明中,如果版本化文件名与缓存文件名不同,则会向客户端浏览器提供新副本; (3)使用mod_rewrite的.htaccess中的RewriteRule重写版本号,将其恢复为原始值并提供更新后的文件.
下面列出了我在这三个阶段中使用的代码.我在http://edge.donaldjenkins.net/上我博客的沙盒版本的样式表上测试了这个
// Allows autoversioning of css and js files
/**
* Given a file, i.e. /css/base.css, replaces it with a string containing the
* file's mtime, i.e. /css/base.1221534296.css.
*
* @param $file The file to be loaded. Must be an absolute path (i.e.
* starting with slash).
*/
function auto_version($file)
{
if(strpos($file, '/') !== 0 || !file_exists($_SERVER['DOCUMENT_ROOT'] . $file))
return $file;
$mtime …Run Code Online (Sandbox Code Playgroud) 每次刷新网站并查看其页面源时,javascript src即js.js?version=1364903356; 版本号总是在变化.
我的问题是:这个数字是什么意思; 如果我放入js.js每一页,该网站无法正常工作.
有没有办法可以在客户端浏览器下次访问网站时替换或删除客户端浏览器中缓存的 css 和 js 文件?
基本设置:Apache 2.4提供的Angular 1.5 SPA由REST api支持,也支持Apache 2.4.
我已经阅读了所有可用的技术,以便在服务器上更改某些应用程序代码后允许SPA更新并更新.
解决方案来自HTTP缓存(HTTP标头)或缓存清除(例如版本控制文件名)技术.所有这些都基于Web浏览器发出请求获取资源并具有一些机制来了解内容是否需要更新或是否可以从缓存提供.
SPA的主要问题是,在初始加载后通常不会对资源进行请求,因为Web应用程序在浏览器中加载得很快,并且只启动对后端的XHR调用来加载数据.在许多情况下,由于长时间不刷新文件的不便,用户不会关闭标签很多天.
最难的问题是index.html文件(见本文).这个只在您第一次在浏览器中加载应用程序时调用,然后永远不会请求它.只有手动浏览器页面重新加载才能初始化此文件的第二个请求.
所有javascript和css文件在请求后加载index.html,然后永远不会重新加载.只有新的请求index.html可以刷新它们.
如果index.html在初始加载后没有获取请求,那么缓存控制头或缓存清除策略如何允许javascript或css文件在服务器上更改时刷新?
我遇到了这个问题的两种方式:
REST API必须与Web应用程序兼容.如果我在API中引入了重大更改,并且用户没有重新加载页面,则可能会触发离开数据不一致的错误.
由于html文件可以重新加载而javascript或css文件没有这样做,因此可以提供不兼容的html文件(例如缺少CSS类定义或范围引用).
我发现的唯一真正的解决方案是:
但:
我遗漏了每个人如何处理Angular缓存的问题?
css ×4
caching ×3
javascript ×3
.htaccess ×2
php ×2
angularjs ×1
asp.net ×1
asp.net-mvc ×1
assets ×1
browser ×1
facebook ×1
html ×1
image ×1
jboss ×1
jquery ×1
mod-rewrite ×1
regex ×1
stylesheet ×1
themes ×1
tomcat ×1
url-routing ×1
versioning ×1
web ×1