如何将ASP.Net OutputCache配置为因http与https而异?
下面是一个场景,用户在浏览器中打开我们的WebApp中的非安全页面,我们称之为PageA,然后单击其中的链接,将他们带到安全的PageB实例。进入PageB后,用户可以随后单击一个链接,将他们带回PageA的安全实例(他们已经查看了该实例,并且该实例位于OutputCache中)。我观察到,即使在访问PageB(安全的)后通过不同的URL访问PageA,它实际上是在提取先前缓存的副本,而不是创建一个新的副本。我在调试会话中验证了此行为,并惊讶于ASP.Net将相同的OutputCache项用于页面的安全副本 我的问题是为什么会这样?我如何告诉ASP.Net OutPutCache将来自安全URL的访问视为与非安全等效项不同/唯一的项 [背景]如何将ASP.Net OutputCache配置为因http与https而异?,asp.net,ssl,outputcache,scene7,Asp.net,Ssl,Outputcache,Scene7,下面是一个场景,用户在浏览器中打开我们的WebApp中的非安全页面,我们称之为PageA,然后单击其中的链接,将他们带到安全的PageB实例。进入PageB后,用户可以随后单击一个链接,将他们带回PageA的安全实例(他们已经查看了该实例,并且该实例位于OutputCache中)。我观察到,即使在访问PageB(安全的)后通过不同的URL访问PageA,它实际上是在提取先前缓存的副本,而不是创建一个新的副本。我在调试会话中验证了此行为,并惊讶于ASP.Net将相同的OutputCache项用于页
我们最近将我们的网站图像切换为对所有图像使用Scene7/Akamai。因此,我们添加了代码,以便在安全连接上查看给定页面时使用不同的scene7url。此OutputCache问题不允许执行输出安全url的逻辑,并导致难看的浏览器警告 我从未尝试过,但您可能可以使用Outputcache VaryByHeader属性和“主机”头,该头指定所请求资源的Internet主机和端口号
我想问的问题是,为什么在从PageB转到PageA后,您要通过安全重定向到PageA。如果这是一个不安全的页面,您能否修复PageB重定向到always redirect to non secure(始终重定向到不安全页面)。这并不能回答所述问题,但它可能会消除您根据方案进行更改的需要。如果您正在硬编码Scene7 URL的“http://”,则可以将其更改为方案相对URL
<img src="http://site.scene7.com/images/someimage.jpg" />
=>
<img src="//site.scene7.com/images/someimage.jpg" />
=>
这将导致浏览器自动请求与引用页面具有相同方案的资源。当然,这是假设您拥有scene7域的SSL证书。我认为您可以执行VaryByCustom=“scheme”,并将其添加到您的Global.asax.cs文件中(包括我使用的其他几个应用程序版本和用户):
+谢谢你的回复。我的例子比我的实际情况简单得多。事实上,我有很多pageB和pageA。将所有链接从pageB更改回pageA的非安全链接将是太多的工作,我希望有一个更简单的方法。+1-如果可以的话会做得更多…这应该被标记为答案。但是,避免IE中CSS的协议亲属:+1。正是我需要的。在我的情况下,用户不应该为我的特定页面使用HTTPS。但如果他们这样做了,我有重定向代码将它们发送到HTTP。然而,这个重定向代码在我按照您的示例中的“scheme”进行更改之前是不起作用的。
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (custom.Equals("version", StringComparison.CurrentCultureIgnoreCase))
{
Assembly asm = Assembly.GetExecutingAssembly();
string[] parts = asm.FullName.Split(',');
string version = parts[1].Trim().ToLower();
return version;
}
else if (custom.Equals("user", StringComparison.CurrentCultureIgnoreCase))
{
var user = Membership.Users.CurrentUser;
return null == user ? string.Empty : user.Id.ToString();
}
else if (custom.Equals("scheme", StringComparison.CurrentCultureIgnoreCase))
{
var scheme = context.Request.IsSecureConnection ? "https" : "http";
return scheme;
}
else
return base.GetVaryByCustomString(context, custom);
}