HTTP到HTTPS(样式表,js,css-sprite等)重新加载

时间:2011-09-01 16:06:00

标签: javascript css ssl http-headers

此问题与混合内容错误无关。即将推出一个网站。当我从http://example.com导航到https://example.com时,我注意到css / js / etc被重载,因为我正在使用根相对路径:。

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

反正有没有阻止这个?用户几乎总是会首先点击该站点的非ssl版本,因此是否有一个脚本会等到加载http内容,而不是强制将https版本强制进入用户缓存?或者我应该在任何页面和每个css背景图像上使用绝对路径(https://www.example.com/_css/main.css)(只有2个我使用精灵)。或者我们只是忍受它?感谢。

5 个答案:

答案 0 :(得分:4)

  

使用http嗅探器,我发现浏览器认为https://www.mysite.com/_css/main.csshttp://www.mysite.com/_css/main.css不同(不是)。

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

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

  

有没有办法阻止这个?

不是。

  

用户几乎总是首先点击该站点的非ssl版本,所以是否有一个脚本会等到加载http内容,而不是强制将https版本强制进入用户缓存?

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

  

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

这样可行,但会导致混合内容问题。

  

或者我们只是忍受它?

答案 1 :(得分:1)

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

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

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

  2. 当用户以Apache方式点击网站时,将所有内容重定向到SSL(Redirect SSL

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

答案 2 :(得分:0)

您可以使用.htaccess RewriteRule每次加载https内容;或者html的http版本中指定的重定向标题会更慢(额外的往返),但我相信也是如此。

答案 3 :(得分:0)

使用协议相对路径。

而不是这个

<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">

然后它将使用父页面的协议。

答案 4 :(得分:-1)

您可以在没有协议说明符的情况下引用文件,例如:

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

有关详细信息,请参阅此帖:

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