Евгений Степанищев

Я — эксперт в области разработки веб-приложений и безопасности в интернете. Каждый месяц мой блог посещают около 90 тысяч человек. Работаю техническим директором в «Системах документооборота», занимаюсь электронным правительством.

«//» в ссылках

Как известно, в вебе, в подавляющем большинстве случаев, для адресации ресурсов применяются HTTP или HTTPS протоколы. Как вы понимаете, я не Капитан Очевидность, так что за этим последует какая-то интрига.

Бывает так, что одна и так же страница должна быть видна по обоим протоколам (например, у нас в интранетах такое бывает часто). В зависимости от того как пользователь зайдёт.

То, что я скажу дальше NDA не является, например, об этом рассказывал Олег Оболенский на РИТ-2007: все сервисы состоят из кусочков, кусочки грузятся с какого-то сервера. На практике это означает, что часть CSS и картинок, которые используются в нашем интранет-хозяйстве лежат на другом сервере и их ковыряют совсем другие люди.

В итоге, когда человек заходит на страницу, ему грузится ещё и CSS с другого сайта, внутри которых могут быть абсолютные (с протоколом) пути, которые подгружают картинки. Если человек зашёл по HTTPS, то и всё остальное должно отдаться по HTTPS (иначе, например, Internet Explorer заругается), если он зашёл по HTTP, то всё должно отдаваться по HTTP (HTTPS нагружает сервер и вообще отдаётся по шифрованному протоколу всё заметно медленее).

Как это реализовать? Как менять протокол, в зависимости от протокола страницы, если CSS, который грузится статичен и менять пути внутри него не получится? Делать два отдельных CSS?

Есть способ проще.

Откуда я о нём узнал, я не помню. Что-то смутно вспоминаю, что, кажется, прочитал у Кукуца много лет назад, с тех пор и использую. Впрочем, память меня тут, вероятно, подводит, потому что до моего прихода в «Яндекс» способа там этого, похоже, не знали.

Способ заключается в том, чтобы не указывать протокол. Выглядит такой URL вот так: «//example.net/picture.jpg» и описан в RFC 1738 как «Common Internet Scheme Syntax»:

While the syntax for the rest of the URL may vary depending on the particular scheme selected, URL schemes that involve the direct use of an IP-based protocol to a specified host on the Internet use a common syntax for the scheme-specific data:

//<user>:<password>@<host>:<port>/<url-path>
Смысл в том, что в таком указания без протокола должен использоваться текущий тип протокола. Таким образом, хорошее решение — просто всегда указывать полный URL в таком виде.
4 апреля 2009 02:33

Alisey (alisey.myopenid.com)
4 апреля 2009, 08:56

Спасибо, для CDN отлично подойдёт.

bolk (bolknote.ru)
4 апреля 2009, 12:42, ответ предназначен Alisey (alisey.myopenid.com):

CND — Content Distribution Network?

anthon.livejournal.com (anthon.livejournal.com)
4 апреля 2009, 14:06

Т.е. ссылка /i/i.png в html открытом по https всегда выдаст картинку из корневого пути, равно как i/i.png из текущего все равно по http? Эксперименты были?

bolk (bolknote.ru)
4 апреля 2009, 15:10, ответ предназначен anthon.livejournal.com:

Кажется, моя попытка объяснить суть провалилась. Попробую на примере:

с
host1.ru/index.html грузится
host2.ru/main.css в котором подгружается
host3.ru/image.jpg

zencd.livejournal.com (zencd.livejournal.com)
4 апреля 2009, 15:12

не знал, не знал

но возможна проблема: если так мало людей об этом знает, об этом секрете могут забыть и разработчики браузеров :-)

bolk (bolknote.ru)
4 апреля 2009, 16:06, ответ предназначен zencd.livejournal.com:

Об этом знаю все люди, прочитавшие RFC по URL. Разработчики браузеров, конечно же, его читают.

А росскийские веб-мастера просто мало читают того, что написано на английском. Вот несколько лет назад все как-то пооткрывали VML и filteres в IE (правда, фильтры на совсем базовом уровне), пройдёт ещё пару лет, откроют HTML+TIME.

Alisey (alisey.myopenid.com)
4 апреля 2009, 23:36, ответ предназначен bolk (bolknote.ru):

CND — Content Distribution Network?

Да, а теперь понял, что https там не светит.

sharovatov.livejournal.com (sharovatov.livejournal.com)
17 апреля 2009, 10:37

спасибо, полезная информация.

но гораздо большее спасибо за мотивацию почитать RFC по URL :)

sharovatov.livejournal.com (sharovatov.livejournal.com)
17 апреля 2009, 12:02

кстати, что интересно, в RFC 3986 (http://tools.ietf.org/html/rfc3986), который обновляет RFC 1738, сказано, что scheme должна быть указана. Но я сейчас проверил, во всех браузерах, вплоть до IE3, Common Internet Scheme Syntax работает. Полагаю, что поддержка этой полезной штуки никогда не будет убрана - ибо зачем?

bolk (bolknote.ru)
17 апреля 2009, 13:54, ответ предназначен sharovatov.livejournal.com:

Возможно, есть какой-то ещё более новый RFC?

sharovatov.livejournal.com (sharovatov.livejournal.com)
17 апреля 2009, 14:32

насколько я знаю, 3986 - последний RFC про URI.

bolk (bolknote.ru)
17 апреля 2009, 15:58, ответ предназначен sharovatov.livejournal.com:

Если взглянуть на пункт 4.2 (Relative Reference), то этот URL находится там:

A relative reference takes advantage of the hierarchical syntax (Section 1.2.3) to express a URI reference relative to the name space of another hierarchical URI.

relative-ref = relative-part [ "?" query ] [ "#" fragment ]

relative-part = "//" authority path-abempty
/ path-absolute
/ path-noscheme
/ path-empty

sharovatov.livejournal.com (sharovatov.livejournal.com)
17 апреля 2009, 16:26, ответ предназначен bolk (bolknote.ru):

ух, точно же! Чёрт, посыпаю пеплом голову. Супер :)

blog.ad.by (blog.ad.by)
4 мая 2009, 13:42

А чего создатели Метрики об этом не знают?
http://help.yandex.ru/metrika/?id=1036910
Пни их там покрепче.

bolk (bolknote.ru)
5 мая 2009, 13:21, ответ предназначен blog.ad.by:

Ничего ж себе. Пну.

bolk (bolknote.ru)
19 мая 2009, 15:35, ответ предназначен blog.ad.by:

В новой версии будет.

blog.ad.by (blog.ad.by)
19 мая 2009, 16:32, ответ предназначен bolk (bolknote.ru):

В гугл-аналитиксе тоже не знают 8-)

bolk (bolknote.ru)
19 мая 2009, 21:11, ответ предназначен blog.ad.by:

Ну, с Гуглом я никак не связан :)

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)

Подсказка по написанию комментария

В комментариях можно применять следующую специальную разметку:

  • слово, обрамлённое в «звёздочки» выделяется *жирным*
  • ссылка становится ссылкой: http://bolknote.ru
  • ссылка в скобках также становится ссылкой, закрывающая скобка не захватывается: (http://bolknote.ru)
  • каждую строку цитаты следует начинать со знака «больше»:
    > это цитата
    > из двух строк
  • можно вставить картинку, залитую на один из сервисов: «Яндекс.Фотки», «Фликр» или «Пикплз». Для этого нужно вставить на страницу полный адрес вашей картинки на сервисе, он превратится в картинку:

    http://fotki.yandex.ru/users/bolknote/view/274311?page=3