有些站点位于共享主机(Windows 2003 Server)上,因此我无法访问服务器配置.
我到处读到有关杠杆浏览器缓存的信息,特别是对于静态文件(jpg,css,js等),但是......在我的情况下如何做到这一点?
主机安装了.NET,web.config文件可以以某种方式帮助吗?如果有,怎么样?
以下可缓存资源的生命周期较短.为以下资源指定将来至少一周的到期日期:
http://pagespeed.googlelabs.com建议我将此作为我的网站的重中之重.我使用的是Windows Server 2008 r2 netframework 4.0 asp.net IIS 7.5.我该怎么做呢 ?
这是您可以看到的直接网址:http://pagespeed.googlelabs.com/#url=www.monstermmorpg.com&mobile=false&rule=LeverageBrowserCaching
浏览器: Firefox 6.0
我使用以下设置进行页面A以确保内容未存储在浏览器的bfcache中:
1) $(window).unload(function(){});
2)以下HTTP标头:
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="expires" content="-1" />
<meta http-equiv="cache-control" content="no-cache"/>
Run Code Online (Sandbox Code Playgroud)
我也迷上了事件pagehide和pageshow.当我离开页面时,pagehide使用CORRECT值调用事件属性persisted = false(这是需要的:缓存中没有持久性!)
浏览了几页后,我window.history.go(-2);回到了A页.此时,我希望Firefox在服务器上轮询更新版本,而不是从缓存中显示.使用pageshow事件属性的CORRECT值调用页面A persisted = false(意味着页面未从缓存加载).但页面内容不是服务器数据; 它是陈旧的内容(与最初离开页面时相同)!Fiddler也没有向服务器显示新请求.
谷歌浏览器也表现出相同的行为.IE按预期工作(重新加载新数据)!
知道我错过了什么吗?
提前致谢!
无论如何在使用Ajax.ActionLink时禁用缓存.我在IE中有问题,如果我删除一个使用ajax actionlink的项目,然后重新加载包含该项目的部分视图,并且该项目重新出现在那里(即使它已被删除)在其他浏览器上它的工作原理罚款和预期
@Ajax.ActionLink("x", "RemoveItem", new { id = item.QuoteLineID, enquiryId = item.EnquiryID }, new AjaxOptions()
{
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "Summary"
}, new { @class = "delete-link" })
Run Code Online (Sandbox Code Playgroud) 为了提高我网站的性能/响应能力,我使用AJAX,replaceState,pushState和popstate监听器实现了部分页面加载.
我基本上将页面的中心部分(HTML)存储为历史记录中的状态对象.单击链接时,我只从服务器请求页面的中心位(用不同的Accept标识标识这些请求)并用javascript替换它.在popstate上,我抓住前面的中央部分并将其推回到dom中.
这大部分工作正常,但我发现了一个我坚持的特殊问题.解释起来有点复杂,所以如果不是很清楚我会道歉.
我们的大部分页面都有一个搜索表单.通过ajax加载部分页面仅在GET请求上,并且表单执行POST,导致整页加载.
如果我浏览下面的一组页面,我最终会出现一个格式错误的部分页面,其中只包含中心内容,而不包含任何周围的dom:
从主页开始(通过整页加载) - 执行搜索(重定向后)
获取搜索结果(通过整页加载) - 然后单击主页
返回主页(通过动态获取) - 单击浏览器返回
搜索结果(来自popstate listener) - 单击浏览器返回
格式错误的主页.
当出现格式错误的主页时,我的popstate监听器根本不存在.
我认为正在发生的是,主页的第二次加载(动态,部分)被浏览器缓存,然后当整页回复发生时,浏览器只显示缓存的部分响应而不是整页.
为了解决这个问题,我在响应中添加了一个Vary:Accept标头,让浏览器知道内容可能会根据accept标头发生变化.我还为部分加载的内容添加了Cache-Control max-age = 0,pragma no-cache和过去的到期日期,以试图强制浏览器不缓存它,但这些都没有解决它.
不幸的是我的公司不允许我们的开发服务器的外部流量,所以我不能告诉你这个问题.我在这里看过各种类似的问题,但它们似乎都不一样,所提出的解决方案似乎也没有用.
如果我向动态GET请求添加一个无意义的参数(blah = blah),这就解决了这个问题.然而,这是一个丑陋的黑客,我宁愿不做.这似乎应该可以解决标题,因为我认为这是一个缓存问题.谁能解释一下发生了什么?
我正在尝试配置我的.htaccess文件来设置缓存时间.尝试了所有可能的配置但没有任何作用!
这是我的HTML中写的:
<meta http-equiv="Cache-Control" content="max-age=2592000, public" />
<!--
<meta http-equiv="expires" content="mon, 24 sep 2012 14:30:00 GMT">
-->
Run Code Online (Sandbox Code Playgroud)
这就是我的.htaccess文件中写的内容:
ExpiresActive On
ExpiresDefault A3600
Run Code Online (Sandbox Code Playgroud)
但是,当我在firefox中刷新包含缓存清除(ctrl + F5)时,我的firebug NET面板说缓存在我访问该文件的同一秒内到期(而不是将来,就像我希望的那样).
我究竟做错了什么??
谢谢
单击href时,我有以下内容来刷新我的页面.
<a href="javascript:history.go(0)">Click to refresh the page</a>
Run Code Online (Sandbox Code Playgroud)
我有这个
<meta http-equiv="no-cache">
Run Code Online (Sandbox Code Playgroud)
在头标签.即便如此,我还是获得了一个缓存副本.如何避免加载缓存副本?
我的网页使用了几个javascript库,如jquery,jquery-ui,下划线,主干和一些其他着名的jquery插件.
现在我面临两难困境,我可以:
使用托管所有这些库的公共CDN.如果用户使用相同的CDN访问了另一个站点,则脚本可能已被缓存.但由于每个库都是独立的,因此页面需要包含许多脚本标记,因此需要许多http请求.
将所有必需的脚本合并为一个(包括我自己的脚本文件)并将其托管在我自己的服务器上.只有一个请求一切,但我无法比CDN更快地提供脚本,我无法利用缓存.
从你自己的经验来看,哪个更好?
我想估计是否有足够的网站使用提到的CDN(如果许多知名网站使用它们,那么缓存脚本的概率很高),我该如何调查?我试过谷歌搜索脚本src属性,但似乎谷歌没有索引.
部署网站的新版本后,浏览器会从旧网页的缓存中加载所有内容,直到完成硬性强制刷新。
在ASP.NET MVC该文件成为捆绑,它通过优化框架处理。添加到您的文件链接的版本,如果您的包文件发生更改,则会生成新令牌。按照下面的代码:
例如,js文件名是:datatables
当你把它放在同名的包中时,你会看到
datatables?v=anY9_bo7KitrGnXQr8ITP3ylmhQe9NDzSjgLpLQWQFE1
Run Code Online (Sandbox Code Playgroud)
作为文件名。更改datatables并在浏览器中再次查看文件名,肯定会更改:
datatables?v=r8yhQBxKyDgrOGyqr1ndtdG92Ije09nqTY7yogrOSTk1
Run Code Online (Sandbox Code Playgroud)
但是有两个问题:
我一直坚持这个问题一段时间了.我已经深入研究并花了很多时间在SO上查看类似的问题 - 但不成功.
一点背景.我有一个网站和一个Android应用程序有效地呈现不同形式的网站,具有不同的显示等...应用程序知道从传入的请求做到这一点 - 因为用户有一个特定的字符串附加到用户代理(让我们只是说, string是'MobileAppRequest').在用户代理中检测到该字符串后,服务器知道返回不同的html文件.这允许用户仍然可以访问他们的浏览器上的网站并使用网络版本以及从他们的Android应用程序获得应用程序体验.
现在,在使用服务工作者时,它默认为用户的标准用户代理,而不包括应用程序中的附加字符串.然后,这将返回应用程序中的Web版本,这会将其全部搞砸.我需要知道如何设置自定义标头,或者确实将字符串附加到服务工作者中的用户代理.它说当我尝试直接更改它时标题是不可变的但我知道解决这个问题的方法是将新请求作为响应.
这是我的SW.js
var CACHE_STATIC_NAME = 'static-v10';
var CACHE_DYNAMIC_NAME = 'dynamic-v2';
self.addEventListener('install', function (event) {
console.log('[Service Worker] Installing Service Worker ...', event);
event.waitUntil(
caches.open(CACHE_STATIC_NAME)
.then(function (cache) {
console.log('[Service Worker] Precaching App Shell');
cache.addAll([
'/',
'/static/media/next.png',
'/static/media/previous.png'
]);
})
)
});
self.addEventListener('activate', function (event) {
console.log('[Service Worker] Activating Service Worker ....', event);
event.waitUntil(
caches.keys()
.then(function (keyList) {
return Promise.all(keyList.map(function (key) {
if (key !== CACHE_STATIC_NAME && key !== CACHE_DYNAMIC_NAME) {
console.log('[Service Worker] Removing old cache.', …Run Code Online (Sandbox Code Playgroud) browser-cache ×10
caching ×3
http-headers ×2
javascript ×2
.net ×1
asp.net ×1
asp.net-ajax ×1
asp.net-mvc ×1
browser ×1
c# ×1
cdn ×1
firefox ×1
html ×1
html5 ×1
iis-7 ×1
lifetime ×1
performance ×1
popstate ×1
pushstate ×1
static-files ×1
web ×1
web-config ×1