views:

175

answers:

3

I am adding an external CSS file and an external JS file to my headers and footers. When loading an HTTPS page, some browsers complain that I am loading unsecured content.

Is there an easy way to make the browser load the external content via HTTPS when the page itself is HTTPS?

A: 

If you use relative paths ( and the content is on the same domain) then the content should use whichever protocol the page was requested in.

However if you are going across domain to a CDN or resource site, or if you need to use absolute paths, then you will need to use server side script to change the links, or always use https://

James Westgate
We are going across domain. Would using javascript to write the include work? If document.location.protocol then ...
nute
Trying using js by inserting markup into the HEAD tag, perhaps a simple document.write inside a script tag .. <HEAD><SCRIPT>document.write('<SCRIPT src=' + document.location.protocol ...
James Westgate
This is approach taken by Google Analytics code, it simply does a document.write with the protocol of the containing page.
Geoff
+3  A: 

Use protocol-relative paths.

Thus not

<link rel="stylesheet" href="http://example.com/style.css"&gt;
<script src="http://example.com/script.js"&gt;&lt;/script&gt;

but so

<link rel="stylesheet" href="//example.com/style.css">
<script src="//example.com/script.js"></script>

then it will use the protocol of the parent page.

BalusC
http://webdosanddonts.com/dont-use-protocol-relative-paths-to-css-files
nute
That's a browser-specific problem. There are no other ways to solve this the robust way than doing this entirely at the server side using the capabilities of the view technology in question.
BalusC
As an additional note, if you take care about the [right caching entries](http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all-browsers/2068407#2068407) in the response headers, the browsers won't download it on the subsequent requests until the expire is reached, including IE.
BalusC
A: 

nute & James Westgate are right when comenting on the later answer.

If we take a look at miscelanous industry-grade external javascript includes, the successfull ones use both document.location.protocol sniffing and script element injection tu use the proper protocol.

So you could use something like :

<script type="text/javascript">
  var protocol = (
      ("https:" == document.location.protocol) 
      ? "https" 
      : "http"
  );
  document.write(
      unescape(
          "%3Cscript"
              + " src='"
                  + protocol 
                  + "://"
                  + "your.domain.tld"
                  + "/your/script.js"
              + "'"
              + " type='text/javascript'
          + "%3E"
          + "%3C/script%3E"
      ) // this HAS to be escaped, otherwise it would 
        // close the actual (not injected) <script> element
  );
</script>

The same can be done for external CSS includes.

And by the way: be careful to only use relative url() path in your CSS, if any, otherwise you might still get the "mixed secure and unsecure" warning....

Alain Saint-Etienne
JS can be disabled...
BalusC
This is just something you have to consider when deciding which technology to use. If you cannot do this on the server side, and you need to go across hosts, then you have no other option.
Geoff