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 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 que funciona en todos los lugares que he probado, pero ¿hay algún caso en el que no funcione?
Respuestas:
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 usado ese método de URL relativo 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.
fuente
Se garantiza que funcione en cualquier navegador convencional (no estoy teniendo en cuenta los navegadores con menos del 0.05% de cuota de mercado). Diablos, funciona en Internet Explorer 3.0.
RFC 3986 define un URI como compuesto de las siguientes partes:
Al definir los URI relativos ( Sección 5.2 ), puede omitir cualquiera de esas secciones, siempre comenzando desde la izquierda. En pseudocódigo, se ve así:
El URI que está describiendo es un URI relativo sin esquema.
fuente
Si se cargó la página principal
file://
, entonces probablemente no funcione (intentará obtenerlafile://cdn.example.com/js_file.js
, que por supuesto también podría proporcionar localmente).fuente
script src="//..."
no estaba funcionando! ¡Estaba abriendo el archivo html localmente!Mucha gente llama a esto una URL relativa al protocolo.
Causa una doble descarga de archivos CSS en IE 7 y 8 .
fuente
Aquí duplico la respuesta en las características ocultas de HTML :
fuente
Es perfectamente válido dejar de lado el protocolo. La especificación de URL ha sido muy clara sobre esto durante años, y todavía tengo que encontrar un navegador que no lo entienda. No sé por qué esta técnica no se conoce mejor; Es la solución perfecta para el espinoso problema de cruzar los límites HTTP / HTTPS. Más aquí: transiciones Http-https y URL relativas
fuente
Solo para agregar esto a la mezcla, si está desarrollando en un servidor local, podría no funcionar. Debe especificar un esquema, de lo contrario, el navegador puede suponer que
src="//cdn.example.com/js_file.js"
es asísrc="file://cdn.example.com/js_file.js"
, lo que se romperá ya que no está alojando este recurso localmente.Microsoft Internet Explorer parece ser particularmente sensible a esto, vea esta pregunta: No se puede cargar jQuery en Internet Explorer en localhost (WAMP)
Probablemente siempre intente encontrar una solución que funcione en todos sus entornos con la menor cantidad de modificaciones necesarias.
La solución utilizada por HTML5Boilerplate es tener un respaldo cuando el recurso no se carga correctamente, pero eso solo funciona si incorpora una verificación:
ACTUALIZACIÓN: HTML5Boilerplate ahora usa
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js
después de decidir desaprobar las URL relativas del protocolo, consulte [aquí] [3].fuente
Siguiendo la referencia del gnud, la sección 5.2 del RFC 3986 dice:
Entonces
//
es correcto :-)fuente
Sí, esto está documentado en RFC 3986 , sección 5.2:
(editar: Vaya, mi referencia RFC estaba desactualizada).
fuente
De hecho, es correcto, como han dicho otras respuestas. Sin embargo, debe tener en cuenta que algunos rastreadores web activarán 404 para estos solicitándolos en su servidor como si fuera una URL local. (No tienen en cuenta el doble corte y lo tratan como un solo corte).
Es posible que desee configurar una regla en su servidor web para capturarlos y redirigirlos.
Por ejemplo, con Nginx, agregaría algo como:
Sin embargo, tenga en cuenta que si usa períodos en sus URI, deberá aumentar la especificidad o terminará redirigiendo esas páginas a dominios inexistentes.
Además, esta es una expresión regular bastante masiva para cada consulta; en mi opinión, vale la pena castigar a los navegadores no conformes con 404 por encima de un (leve) éxito de rendimiento en la mayoría de los navegadores conformes.
fuente
Estamos viendo errores 404 en nuestros registros cuando usamos //somedomain.com como referencias a archivos JS.
Las referencias que causan los 404 salen así: ref:
Solicitud 404:
Con esto apareciendo regularmente en los registros de nuestro servidor web, es seguro decir que: Todos los navegadores y Bots NO cumplen con RFC 3986 sección 4.2. La apuesta más segura es incluir el protocolo siempre que sea posible.
fuente
1. Resumen
Respuesta para 2019: aún puede usar URL relativas al protocolo, pero esta técnica es un antipatrón .
También:
https://
Sería bueno migrar desde URL relativas al protocolo a él.2. Relevancia
Esta respuesta es relevante para enero de 2019. En el futuro, los datos de esta respuesta pueden quedar obsoletos.
3. Anti-patrón
3.1. Argumentación
Paul Irish, ingeniero front-end y defensor del desarrollador para Google Chrome , escribe en 2014, diciembre :
3.2. Otros enlaces
3.3. Ejemplos
https
4. Proceso de desarrollo
Por ejemplo, trato de usar la consola limpia .
KiraCleanConsole__cdn_links_demo.html
:El enlace
//cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
es válido, pero recibo un error.Presta atención
file://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
y lee las respuestas de Thilo y bg17awfile://
.No sabía sobre este comportamiento y no podía entender por qué tengo problemas como este para los pageres .
5. Herramientas de terceros
Utilizo el paquete de texto sublime de URLs clicables. Úselo, simplemente puedo abrir enlaces desde mi editor de texto en el navegador.
Ambos enlaces, por ejemplo, son válidos. Pero el primer enlace que puedo abrir con éxito en el navegador usa URL clicables, segundo enlace - no. Esto puede no ser muy conveniente.
6. Conclusión
Si:
Developing process
elemento, puede configurar su flujo de trabajo de desarrollo.Third-party tools
artículo, puede contribuir con herramientas.Pero no necesita estos problemas adicionales. Lea la información por enlaces en el
Anti-pattern
elemento: las URL relativas al protocolo están obsoletas.fuente
El patrón que veo en html5-boilerplate es:
Se ejecuta sin problemas en diferentes esquemas como
http
,https
,file
.fuente
https://
para todohttps://
todas partes es que luego debe seguir revisando todos sus enlaces externos para ver si realmente lo admiten, y cambiarlos ahttp://
si no lo hacen (de lo contrario, no funcionarán). Esto puede ser problemático con una gran cantidad de enlaces.https://
debería (o puede) usarse en todos los enlaces que no es correcto.Como su ejemplo se vincula a un dominio externo, si está utilizando HTTPS, entonces debe verificar que el dominio externo también esté configurado para SSL. De lo contrario, sus usuarios pueden ver errores SSL y / o errores 404 (por ejemplo, las versiones anteriores de Plesk almacenan HTTP y HTTPS en carpetas separadas). Para las CDN, no debería ser un problema, pero podría serlo para cualquier otro sitio web.
En una nota al margen, probado mientras se actualiza un sitio web antiguo y también funciona en la url = parte de una actualización META.
fuente