¿Es válido reemplazar http:// con / / en a?


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 todas partes que he probado, pero ¿hay casos en los que no funciona?

Author: unor, 2009-02-15

13 answers

Una URL relativa sin un esquema (http: o https:) es válida, según RFC 3986: "Uniform Resource Identifier (URI): Generic Syntax", Sección 4.2. Si un cliente se atraganta en él, entonces es culpa del cliente porque no está cumpliendo con la sintaxis URI especificada en el RFC.

Su ejemplo es válido y debería funcionar. He usado ese método de URL relativo yo mismo 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.

 375
Author: Jeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-02 18:52:34

Se garantiza que funcione en cualquier navegador convencional (no estoy tomando navegadores con menos de 0.05% de cuota de mercado en consideración). 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 por la izquierda. En pseudo-có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 sin esquema URI relativa.

 147
Author: Andrew Moore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-06 19:25:38

¿Hay casos en los que no funciona?

Si la página padre se cargó desde file://, entonces probablemente no funcione (intentará obtener file://cdn.example.com/js_file.js, que por supuesto también podría proporcionar localmente).

 76
Author: Thilo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-19 08:27:19

Muchas personas llaman a esto una URL Relativa al Protocolo.

Causa una doble descarga de archivos CSS en IE 7 & 8 .

 40
Author: SLaks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-04 15:58:05

Aquí duplico la respuesta en Características ocultas de HTML :

Usando un absoluto independiente del protocolo ruta:

<img src="//domain.com/img/logo.png"/>

Si el navegador está viendo una página en SSL a través de HTTPS, luego solicitará ese activo con el protocolo https, de lo contrario lo solicitará con HTTP.

Esto evita que horrible " Esta página Contiene Tanto Seguro como No Seguro Items " mensaje de error en IE, manteniendo todas sus solicitudes de activos dentro del mismo protocolo.

Advertencia: Cuando se utiliza en un <link> o @ importar para una hoja de estilos, IE7 e IE8 descargue el archivo dos veces. Todos los demás los usos, sin embargo, están bien.

 22
Author: kennytm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:22

Es perfectamente válido dejar el protocolo. La especificación de URL ha sido muy clara sobre esto durante años, y aún no he encontrado un navegador que no lo entienda. No se por qué esta técnica no es mejor conocida; es la solución perfecta al espinoso problema de cruzar los límites HTTP/HTTPS. Más aquí: Transiciones Http-https y URLs relativas

 16
Author: Ned Batchelder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-19 08:54:16

¿Hay casos en los que no funciona?

Solo para agregar esto a la mezcla, si está desarrollando en un servidor local, puede que no funcione. Es necesario especificar un esquema, de lo contrario el navegador puede asumir que src="//cdn.example.com/js_file.js" es src="file://cdn.example.com/js_file.js", que se romperá ya que no está alojando este recurso localmente.

Microsoft Internet Explorer parece ser particularmente sensible a esto, vea esta pregunta: No es capaz de cargar jQuery en Internet Explorer en localhost (WAMP)

Probablemente siempre intentaría 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 una alternativa cuando el recurso no se carga correctamente, pero eso solo funciona si se incorpora una comprobación:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<!-- If jQuery is not defined, something went wrong and we'll load the local file -->
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>

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, vea [aquí] [3].

 5
Author: bg17aw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:09:56

Siguiendo la referencia de gnud, el RFC 3986 sección 5.2 dice:

Si el componente de scheme está definido, indicando que la referencia comienza con un nombre de scheme, luego la referencia se interpreta como un URI absoluta y hemos terminado. De lo contrario, el esquema del URI de referencia se hereda del componente scheme del URI base .

Así que // es correcto: -)

 3
Author: Pablo Torrecilla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-25 07:46:42

Sí, esto está documentado en RFC 3986, sección 5.2:

(editar: Oops, mi referencia RFC estaba desactualizada).

 2
Author: gnud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-04 15:55:51

De hecho es correcto, como han declarado otras respuestas. Sin embargo, debe tener en cuenta que algunos rastreadores web activarán 404s para estos solicitándolos en su servidor como si fuera una URL local. (No tienen en cuenta la doble barra y la tratan como una sola barra).

Es posible que desee configurar una regla en su servidor web para capturarlos y redirigirlos.

Por ejemplo, con Nginx, agregarías algo como:

location ~* /(?<redirect_domain>((([a-z]|[0-9]|\-)+)\.)+([a-z])+)/(?<redirect_path>.*) {
  return 301 $scheme:/$redirect_domain/$redirect_path;
}

Tenga en cuenta, sin embargo, que si utiliza períodos en sus URI, tendrá que aumente la especificidad o terminará redirigiendo esas páginas a dominios inexistentes.

También, esta es una expresión regular bastante masiva que se ejecuta para cada consulta in en mi opinión, vale la pena castigar a los navegadores no compatibles con 404s sobre un (leve) golpe de rendimiento en la mayoría de los navegadores compatibles.

 2
Author: jlovison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-03 11:33:55

Estamos viendo errores 404 en nuestros registros al usar //somedomain.com como referencias a archivos JS.

Las referencias que causan los 404s salen con este aspecto: ref:

<script src="//somedomain.com/somescript.js" />

404 solicitud:

http://mydomain.com//somedomain.com/somescript.js

Con estos apareciendo regularmente en los registros de nuestro servidor web, es seguro decir que: Todos los navegadores y Bots NO respetan la sección 4.2 de RFC 3986. La apuesta más segura es incluir el protocolo siempre que sea posible.

 2
Author: Lemiarty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-29 14:19:45

El patrón que veo en html5-boilerplate es:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>

Funciona sin problemas en diferentes esquemas como http, https, file.

 1
Author: neurite,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-25 07:46:14

Como su ejemplo está enlazando a un dominio externo, si está utilizando HTTPS, 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, versiones anteriores de Plesk store HTTP y HTTPS en carpetas separadas). Para las CDN, no debería ser un problema, pero para cualquier otro sitio web podría serlo.

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.

 0
Author: user2246924,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-25 23:27:41