¿Es válido reemplazar http:// por // en un <script src="http://...">?

Resuelto Darryl Hein asked hace 15 años • 14 respuestas

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?

Darryl Hein avatar Feb 15 '09 07:02 Darryl Hein
Aceptado

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.

Jeff avatar Feb 15 '2009 00:02 Jeff

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.

Andrew Moore avatar Jun 04 '2010 15:06 Andrew Moore

¿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).

Thilo avatar Oct 19 '2011 08:10 Thilo

Mucha gente llama a esto URL relativa al protocolo.

Provoca una doble descarga de archivos CSS en IE 7 y 8 .

SLaks avatar Jun 04 '2010 15:06 SLaks