¿Es válido reemplazar http:// por // en un <script src="http://...">?
Tengo el siguiente elemento:
<script type="text/javascript" src="https://cdn.example.com/js_file.js"></script>
En este caso, el sitio es HTTPS, pero el sitio también puede ser solo HTTP. (El archivo JS está en otro dominio). Me pregunto si es válido hacer lo siguiente por conveniencia:
<script type="text/javascript" src="//cdn.example.com/js_file.js"></script>
Me pregunto si es válido eliminar el http:
o https:
?
Parece funcionar en todos los lugares que he probado, pero ¿hay algún caso en el que no funcione?
Una URL relativa sin un esquema (http: o https:) es válida, según RFC 3986: "Identificador uniforme de recursos (URI): sintaxis genérica", Sección 4.2 . Si un cliente se ahoga, entonces es culpa del cliente porque no cumple con la sintaxis de URI especificada en el RFC.
Su ejemplo es válido y debería funcionar. Yo mismo he utilizado ese método de URL relativa en sitios con mucho tráfico y no he tenido ninguna queja. Además, probamos nuestros sitios en Firefox, Safari, IE6, IE7 y Opera. Todos estos navegadores entienden ese formato de URL.
Se garantiza que funcionará en cualquier navegador convencional (no tomo en consideración navegadores con menos del 0,05% de participación de mercado). Diablos, funciona en Internet Explorer 3.0.
RFC 3986 define un URI como compuesto por las siguientes partes:
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
Al definir URI relativos ( Sección 5.2 ), puede omitir cualquiera de esas secciones, siempre comenzando desde la izquierda. En pseudocódigo, se ve así:
result = ""
if defined(scheme) then
append scheme to result;
append ":" to result;
endif;
if defined(authority) then
append "//" to result;
append authority to result;
endif;
append path to result;
if defined(query) then
append "?" to result;
append query to result;
endif;
if defined(fragment) then
append "#" to result;
append fragment to result;
endif;
return result;
El URI que está describiendo es un URI relativo sin esquema.
¿Hay algún caso en el que no funcione?
Si la página principal se cargó desde file://
, entonces probablemente no funcione (intentará obtener file://cdn.example.com/js_file.js
, lo que, por supuesto, también podría proporcionar localmente).
Mucha gente llama a esto URL relativa al protocolo.
Provoca una doble descarga de archivos CSS en IE 7 y 8 .