Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将ASP.Net OutputCache配置为因http与https而异?_Asp.net_Ssl_Outputcache_Scene7 - Fatal编程技术网

如何将ASP.Net OutputCache配置为因http与https而异?

如何将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项用于页

下面是一个场景,用户在浏览器中打开我们的WebApp中的非安全页面,我们称之为PageA,然后单击其中的链接,将他们带到安全的PageB实例。进入PageB后,用户可以随后单击一个链接,将他们带回PageA的安全实例(他们已经查看了该实例,并且该实例位于OutputCache中)。我观察到,即使在访问PageB(安全的)后通过不同的URL访问PageA,它实际上是在提取先前缓存的副本,而不是创建一个新的副本。我在调试会话中验证了此行为,并惊讶于ASP.Net将相同的OutputCache项用于页面的安全副本

我的问题是为什么会这样?我如何告诉ASP.Net OutPutCache将来自安全URL的访问视为与非安全等效项不同/唯一的项

[背景]


我们最近将我们的网站图像切换为对所有图像使用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);
    }