2011-09-01 50 views
5

此问题与混合内容错误无关。即将推出一个网站。当我从http://example.com导航到https://example.com时,我注意到css/js/etc被redownloaded,因为我使用了根相对路径:。重新加载HTTP到HTTPS(样式表,js,css-sprites等)

使用http嗅探器,我发现浏览器认为https://www.example.com/_css/main.csshttp://www.example.com/_css/main.css(不是)不同。因此,相同的确切内容会下载两次,导致网站看起来从http到https导航缓慢(如果用户没有同时缓存两个版本)。

反正有阻止吗?用户几乎总是会首先点击该站点的非SSL版本,因此是否有脚本会等到http内容被加载,而不是强制https版本进入用户缓存?或者,我应该永远使用绝对路径(https://www.example.com/_css/main.css)和每个CSS背景图像(只有2我使用精灵)。或者我们只是住在一起吗?谢谢。

+0

请使用[example.com](http://www.iana.org/domains/example/)和朋友举例。 mysite.com是一家真正的托管公司,不需要假链接指向他们给他们404错误。 – Quentin

+0

固定...对不起 – Steve

回答

4

使用HTTP嗅探器我看到浏览器认为https://www.mysite.com/_css/main.css是不同于http://www.mysite.com/_css/main.css(其不)。

它是具有相同内容的不同资源。浏览器无法知道他们将拥有相同的内容。

您可以重定向(使用301)从一个到另一个,因此您没有非SSL版本。

反正有阻止吗?

不是。

用户将几乎总是撞了上去网站的非SSL版本,第一等是有一个脚本,将等到HTTP内容加载比可能迫使HTTPS版本到用户缓存?

不会。如果一个URL可以预缓存任意其他URL的内容,那将是一个可怕的安全问题。

或者我应该使用绝对路径(https://www.mysite.com/_css/main.css)永远页和每个CSS背景图像(只有2我使用精灵)。

这将工作,但会导致混合内容问题。

或者我们只是住在一起吗?

是的。

+0

关于安全问题的好处,没有想到这一点。那么我想我会与它一起生活,直到互联网神灵提出一个替代方案。和平。 – Steve

+0

至于JavaScript的解决方案,我认为沿线:http://headjs.com/。 JavaScript在重载默认功能的地方,在加载样式之前...沿着这些线条。像加载http main.css和页面的其余部分一样,然后触发加载https版本的js代码。 – Steve

-1

您可以参考文件,而不协议说明,如:

<link rel="stylesheet" type="text/css" href="//mysite.com/_css/main.css" /> 

看到这个职位的详细信息:

Can I change all my http:// links to just //?

+0

这些将解析为已被使用的相同的URI,所以这不会改变任何东西。 – Quentin

+0

基本上这已经发生。浏览器只是认为https main.css与http main.css不同,所以它在技术上是一个不同的资源,但内容相同...有点sux。 – Steve

0

您可以使用一个。htaccess RewriteRule每次加载https内容;或者在http版本的html中指定的重定向头部会更慢(额外的往返),但其他情况也是如此,我相信。

1

有几种方法可以解决这个问题。

  1. 使用base tag。然后为您的资源使用相对路径,缓存将被认为适用于http和https,但实际上它只是在https上加载。 Demonstration

    <base href="https://example.com/" />

  2. 当用户点击该网站的Apache的方式(Redirect SSL

    Redirect permanent/https://example.com/login

+0

强制ssl没有解决这个问题,它仍然从非ssl版本重定向到ssl版本,给用户一个警告! – BigSack

+0

实际上,强制SSL确实解决了这个问题,http://wiki.apache.org/httpd/RewriteHTTPToHTTPS。但真正的标签是他们正在寻找的。这会导致页面每次加载从https://版本加载的内容,无论其他所有内容是否安全。不知道你使用的浏览器是什么,但你的警告是一个孤立的事件。 – Jeff

0

使用协议相对路径重定向一切SSL。

取而代之的是

<link rel="stylesheet" href="http://domain.com/style.css"> 
<link rel="stylesheet" href="https://domain.com/style.css"> 

使用本

<link rel="stylesheet" href="//domain.com/style.css"> 

那么它将使用父页面协议。