Чи можу я змінити всі свої http: // посилання на просто //?


240

Дейв Уорд каже:

Це не зовсім легке читання, але в розділі 4.2 RFC 3986 передбачені повністю кваліфіковані URL-адреси, які взагалі опускають протокол (HTTP або HTTPS). Якщо протокол URL-адреси пропущено, браузер використовує натомість протокол базового документа.

Простіше кажучи, ці URL-адреси "без протоколу" дозволяють такій посилання працювати в кожному браузері, в якому ви спробуєте:

//ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js

Спочатку це виглядає дивно, але ця URL-адреса без протоколу є найкращим способом посилання на вміст сторонніх розробників, який доступний як через HTTP, так і HTTPS.

Це, безумовно, вирішить купу помилок із змішаним вмістом, які ми бачимо на сторінках HTTP - якщо припустити, що наші активи доступні як через HTTP, так і HTTPS.

Чи сумісний це повністю крос-браузер? Чи є інші застереження?


Я читав про цю техніку в блозі IE деякий час тому. Але коли я спробував, це не дуже добре працює. Якщо мій сайт обслуговувався HTTPS, браузер (Chrome) все ще використовував HTTP для URL-адрес без протоколу.
Крістофер Рамірес

10
ПОПЕРЕДЖЕННЯ: НЕ ЗАБЕЗПЕЧУЙТЕ, щоб НІКОЛИ користувацькі схеми URI в перенаправленнях HTTP 3xx !! HTTP заголовки не сумісні з цим форматом URL. Якщо вам потрібно переспрямувати залежно від схеми, використовуйте mod_rewrite або подібне.
користувач2596282

1
@ user2596282 Експериментація в сучасних версіях Chrome і Firefox не погоджується з вами, як і (ще в проекті) перегляд HTTP 1.1. специфікації, визначені робочою групою HTTPbis (див. svn.tools.ietf.org/svn/wg/httpbis/draft-ietf-httpbis/latest/… ). Можливо, те, що ви говорите, стосується деяких браузерів; чи знаєте ви про які-небудь конкретні помилки, пов’язані з протоколами щодо URL-адрес у заголовках місцеположення?
Марк Амерді


Не використовуйте їх, вони некрасиві та зайві.
IllidanS4 хоче, щоб Моніка повернулася

Відповіді:


204

Я ретельно перевірив це перед публікацією. З усіх браузерів, доступних для тестування на браузерних знімках , я міг знайти лише той, який неправильно обробляв відносну URL-адресу протоколу: незрозумілий * nix-браузер під назвою Dillo .

Є два недоліки, про які я отримав відгуки:

  1. URL-адреси без протоколу можуть працювати не так, як очікувалося, коли ви "відкриєте" локальний файл у своєму браузері, оскільки базовим протоколом сторінки буде файл: ///. Особливо, коли ви використовуєте URL-адресу без протоколу для зовнішнього ресурсу, як-от об'єкта, розміщеного CDN. Використання локального веб-сервера на зразок Apache або IIS для тестування на http: // localhost адреси добре працює.
  2. Мабуть, існує принаймні одне додаток для читання каналів iPhone, яке не правильно обробляє URL-адреси без протоколів. Мені невідомо, у кого є проблема чи наскільки вона популярна. Для розміщення файлу JavaScript це не велика проблема, оскільки читачі RSS зазвичай ігнорують вміст JavaScript. Однак це може бути проблемою, якщо ви використовуєте ці URL-адреси для таких засобів масової інформації, як зображення всередині вмісту, які потрібно синдикувати за допомогою RSS (хоча, це одне додаток для читання на одній платформі, ймовірно, має дуже незначну кількість читачів).

33
Хоча IE7 / 8 обробляє URL-адреси відносно протоколу (т.к. схеми без URI) в більшості випадків, коли таблиці стилів вказані з такими URL-адресами, він завантажить їх двічі . (Так каже Стів Судерс )
lucasrizoli

3
Я виявляю, що IE6 намагається перетворити URI у відносний (тобто видалити одну з провідних косої риски). Це в linkстихії. Наприклад, при вказівці //fonts.googleapis.com/css?family=Rokkitt:400,700IE6 намагається завантажити http://mysite.com/fonts.googleapis.com/css/<...>. Не так добре!
CBono

2
З моїх журналів я виявив випадки того, що, схоже, роботи-павуки в Інтернеті (джерело невідоме) намагаються використовувати посилання без протоколу, а також неправильно обробляти їх.
Kzqai

3
Я багато що бачив у своїх журналах, не пов’язаних із URL-адресами без протоколу. Дуже багато цих павуків написані просто неймовірно погано.
Дейв Уорд

11
Важливо розуміти , що ці адреси є НЕ від протоколу менше , але від протоколу відносного . Вони отримують протокол із свого контексту, і, не маючи контексту, вони будуть діяти як URL-адреси файлів у більшості браузерів, що означає, що вони порушуються, оскільки вони не завантажують потрібний вміст. Хоча вони працюватимуть при доставці через http, ви побачите, що якщо ви збережете сторінку та завантажите такий самий HTML з локального файлу, вони не стануть, оскільки контекст інший. Єдиний контекст, у якому ви повинні їх використовувати, це http vs https.
Синхро

37

Питання про те, чи можна змінити всі їх посилання на протокольні, може бути суперечливим, враховуючи питання, чи варто робити це. За словами Пола Ірландського :

2014.12.17: Тепер, коли SSL заохочується для всіх і не має проблем із ефективністю, ця методика тепер є антидіаграмою. Якщо потрібний вам ресурс доступний у SSL, то завжди використовуйте актив https: // .


Я думав точно так само. Який сенс у завантаженні зовнішнього ресурсу через http, якщо він доступний і через https - навіть якщо на основному веб-сайті використовується http (чого він не повинен, але це інша тема).
joonas.fi

1
@ joonas.fi Єдине, про що я можу придумати, - це уникати змішаних попереджень HTTP / HTTPS, які можуть бути створені деякими браузерами
Охад Шнайдер,

3
Попередження @Ohad_Schneider спрацьовують лише в тому випадку, якщо документ завантажено захищено (https), але активи над незахищеними (http). Що я запропонував, це те, що ви завжди можете завантажувати активи над захищеними, навіть якщо документ завантажений незахищено. Немає жодних попереджень і жодних причин не використовувати захищені, роблячи непотрібними цілі "URL-адреси щодо протоколу".
joonas.fi

1
@Ohad_Schneider О, вибачте, я думаю, що я неправильно трактував те, що ви говорили. Завантаження активів через https, коли документ закінчується http, не повинен створювати попереджень. Але завантаження активів через http, коли ваш документ закінчується https (і, ймовірно, заблоковано за замовчуванням, принаймні в Chrome). Ви зверталися до випадку, коли ви обслуговуєте свій веб-сайт через https, а зовнішні активи доступні лише під http? Так, це може бути проблемою, але я не думаю, що немає жодної серйозної сторонньої служби, яка не обслуговує їх вміст через https, інакше вони все-таки повинні припинити роботу. :)
joonas.fi

@ joonas.fi Wut? O_o Якщо хтось має відповідні URL-адреси протоколу HTTPSed (тоді), це не допоможе вирішити отримання сторонніх активів через HTTP - ні в якому разі. І в будь-якому випадку краще, щоб на вашій сторінці HTTPS не було логотипу чистого зеленого SSL, ніж повернути його знову на HTTP лише через те, що треті сторони ще не підтримують HTTPS.
poige

30

Якщо ви використовуєте URL-адреси без протоколів для завантаження таблиць стилів, IE 7 і 8 завантажуватимуть їх двічі: http://www.stevesouders.com/blog/2010/02/10/5a-missing-schema-double-download/

Отже, цього потрібно уникати для CSS, якщо вам подобається хороша продуктивність.


5
Правда, однак це стає все менше причин уникати використання безшовних URL-адрес, оскільки частка ринку IE 7 і 8 скорочується.
Саймон Лішке

15

Так, посилання на мережевий шлях уже були визначені в RFC 1808 і повинні працювати з усіма браузерами.


11
Його навіть рекомендують та використовують у кодовому
Феліпе Ліма,

1
ні Так, ви не відповідаєте Так на "Чи є інші застереження?" ? ;)
Caspar Kleijne

2
@Caspar Kleijne: Я пояснив "Так" рештою речення.
Gumbo

1
Каспер, Гумбо насправді відповідав на два запитання: "Чи сумісний це повністю перехресний браузер? Чи є інші застереження?" Так, це відповідь на перше запитання.
Даррен Гріффіт

4

Чи сумісний це повністю крос-браузер? Чи є інші застереження?

Просто кинути це в суміш, якщо ви розробляєте на локальному сервері, це може не спрацювати. Потрібно вказати схему, інакше браузер може припустити, що src="//cdn.example.com/js_file.js"це єsrc="file://cdn.example.com/js_file.js" буде зламана, оскільки ви не розміщуєте цей ресурс локально.

Microsoft Internet Explorer, здається, особливо чутливий до цього, див. Це питання: Не вдається завантажити jQuery в Internet Explorer на localhost (WAMP)

Ви, ймовірно, завжди намагатиметесь знайти рішення, яке працює для всіх ваших середовищ із найменшою кількістю необхідних модифікацій.

Рішення, яке використовується HTML5Boilerplate, полягає в тому, щоб мати резервний запас, коли ресурс не завантажений правильно, але це працює лише за умови включення чека:

<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>

Цю відповідь я також розмістив тут .

ОНОВЛЕННЯ: HTML5Boilerplate тепер використовується <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">після прийняття рішення про зняття відносних URL-адрес протоколу, дивіться тут .


1

У мене не було цих проблем при використанні: //domain.com - але вам потрібно додати двокрапку на початку. Йоаст добре записував про це деякий час назад. Але це втрачено в його купі публікацій блогу.


голосування вниз за те, щоб не вказати, де додатково: корисно. Скрізь, коли я випадково залишив ":", перервав посилання
грабував

0

Якщо ви хочете переконатися, що всі запити були оновлені до захищеного протоколу, є простий варіант використовувати оновлення заголовка політики безпеки вмісту -небезпечні запити.

Content-Security-Policy: upgrade-insecure-requests;

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.