De l’import correct des ressources externes

Lorsque l’on importe, dans une page HTML, des ressources externes, nous devons forcément passer par une URL absolue.

Le problème des protocoles se pose alors. Si ma page est accessible en HTTP et que je fais mon import en HTTPS, pas de soucis. Par contre, si ma page est accessible en HTTPS et que je fais mon import en HTTP, c’est moins bien.

A tel point que, pendant que Firefox ne dit mot, Chrome râle :

[blocked] The page at https://***/ ran insecure content from http://***/***.js.

Comment résoudre ce problème de façon harmonieuse en faisant automatiquement un import HTTP lorsque la page est accédée en HTTP, et un import en HTTPS quand la page est accédée en HTTPS ?

Le RFC 1808, datant de 1995 et relatif aux URLs vient alors à notre secours.

Après un rappel sur le format des URLs :

<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>
[RFC 1808 sur IETF.org]

Il détaille dans sa quatrième partie, comment reconstituer une URL relative, et pour le cas qui nous intéresse :

Step 2: Both the base and embedded URLs are parsed into their component parts as described in Section 2.4.
[…]
c) Otherwise, the embedded URL inherits the scheme of the base URL.
[RFC 1808 sur IETF.org]

Il est donc faux de dire qu’un import de ressource externe doit forcément être fait via une URL absolue, et la solution consiste donc à ne pas préciser le schéma ou protocole :

src=’//***.ext’

C’est d’ailleurs ce que propose le CDN de Google. Et c’est également ce qui fait que, pour JQuery, il est impossible d’utiliser le CDN officiel puisque non accessible en HTTPS.

Posté le 16 mai 2013 par Jacques Danielle