Почему URL-адреса файлов начинаются с 3-х слешей?


182

HTTP начинается с двух слешей. Например http://example.com.

То же самое касается FTP. Например ftp://example.com.

Однако файл «URL» начинается с трех косых черт. Например, читая PDF-файл, используя Chrome, URL будет file:///D:/Desktop/Book.pdf.

Почему URL-адреса файлов используют три слеша?


5
Opera для Windows расширяет его до file://localhost/D:/Desktop/автоматически.

Ответы:


14

Как уже упоминалось, схема файла имеет вид "file: // <host> / <path>". Хотя у большинства браузеров не будет проблем только с двумя слешами, и это справедливо.

При прочих равных условиях тройной слэш и ключевое слово «localhost» существуют только для обеспечения соответствия действительному синтаксису URI / URL. В контексте файловой схемы хост не имеет смысла, поскольку он загружается непосредственно из файловой системы без какого-либо явного протокола передачи или пути к документу сервера. Поскольку это не HTTP, он не может загружаться со стандартного веб-сервера, где теоретически можно настроить несколько локальных виртуальных хостов. И он не может загружаться со стандартного сетевого тома, который технически является другим «хостом», поскольку браузер просто использует имя тома, например, «file: /// volume / foo». Наконец, попытка таких вещей, как «file: //example.com/some/file», не работает. Вероятно, есть какая-то причина для поддержки внешнего хоста, но я не могу думать ни о какой.

IETF в настоящее время готовит изменения, чтобы убрать требование тройной косой черты, хотя черновик также добавляет несколько странных возможностей, таких как file:c|/pathи четные file://///host.example.com/path.

https://tools.ietf.org/html/draft-ietf-appsawg-file-scheme-03

«3. Данная спецификация не определяет и не запрещает механизм доступа к нелокальным файлам».


1
Проект стал RFC 8089 в 2017 году, который все еще включает вашу цитату.
ComFreek

252

Полный синтаксис есть file://host/path.

Если хост есть localhost, его можно опустить, что приведет к file:///path.

См. RFC 1738 - Унифицированные указатели ресурсов (URL) :

URL файла принимает форму:

file://<host>/<path>

[...]

В качестве особого случая <host>может быть строка «localhost» или пустая строка; это интерпретируется как «машина, с которой интерпретируется URL».


3
Круто, я не ожидал, что ответ на этот вопрос будет стандартом RFC!
Pacerier

33
@Pacerier Почти все, что связано с Интернетом, может быть объяснено RFC (обратите внимание, что они не обязательно являются «стандартами», но могут быть приняты как таковые).
slhck

5
Обратите внимание, что Тим Бернерс Ли принес извинения за те две косые черты, которые есть в каждом URL: news.bbc.co.uk/2/hi/technology/8306631.stm
Питер,

7
Могу ли я опустить localhostдругие протоколы или это работает только для file://?
Agos

3
Обратите внимание, что Firefox на самом деле не следует этому стандартному `file: // test / C: \` будет вести себя так же, как `file: /// C: \`, а `http: /// test` выдаст недопустимый URL ошибка
Earlz

27

Деннис объяснил 3-й слэш, необходимый для отделения hostот path, но два других гораздо интереснее ...

Оказывается, они были бесполезным и несколько произвольным дополнением к синтаксису URL. Тим Бернерс-Ли, изобретатель Всемирной паутины и автор многих из ее стандартов (в том числе RFC, с которым связался Деннис), выразил сожаление по поводу использования «двойной черты» в интервью в 2009 году.

Г-н Бернерс-Ли объяснил, что двойная косая черта, хотя в то время это было соглашение о программировании, оказалась не очень необходимой. Посмотрите на все бумаги и деревья, сказал он, которые можно было бы спасти, если бы людям не пришлось писать или печатать эти черточки на бумаге в течение многих лет - не говоря уже о человеческом труде и времени, потраченном на ввод этих двух нажатий клавиш бесчисленными миллионами раз в адресных полях браузера.

http://bits.blogs.nytimes.com/2009/10/12/the-webs-inventor-regrets-one-small-thing/

Таким образом, если не считать незначительного (и нехарактерного) упущения в предвидении около 18 лет назад, URL вашего файла мог бы быть легко file:/D:/Desktop/Book.pdf, а не file:///D:/Desktop/Book.pdf.

Существует, чтобы ответить на ваш вопрос, нет веской причины, почему URL-адреса имеют 3 слеша.


Обновление: как отмечает @ComFreek в комментариях, по состоянию на 2017 год file:/D:/...приведенный выше пример теперь действителен! Это благодаря RFC 8089 , который специально вызывает это исправление из предыдущего стандарта ...

Согласно определению в [RFC1738], URL-адрес файла всегда начинается с токена «file: //», за которым следует (необязательно пустое) имя хоста и «/». Синтаксис, приведенный в Разделе 2, делает необязательным весь компонент полномочий, включая двойную косую черту «//».

Какое время быть живым.


2
TimBL также подробно останавливается на этом в своем FAQ
Molomby

2
Не говоря уже о том, что 2 байта можно сохранить, просто используя http:example.comвместо http://example.comнего. Может показаться, что это немного , но они складываются. Google получает миллионы запросов в день. Сколько ссылок на странице? По крайней мере, 20. Это означает, что для миллиона поисков, если косые черты не нужны, можно было бы сэкономить 20 МБ полосы пропускания.
Коул Джонсон

1
@ColeJohnson - Знаете ли вы, что вы также можете пропустить часть протокола? Так http://example.comможет быть связано с тем, как //example.comв документе, переданном по http. Это называется относительным URL протокола , все браузеры их поддерживают.
Моломби

Я хорошо знаю об этом, но лично я использую их только в CSS. При написании HTML я также использую протокол. На самом деле никакой реальной причины. За исключением, может быть, потому, что когда HTML5 + CSS3 впервые стал «большим» несколько лет назад, почти все сайты, на которые я смотрел, были такими.
Коул Джонсон

1
Вопреки тому, что может предложить ваш ответ, file:/D:/Desktop/Book.pdfдействительный URI файла в соответствии с RFC 8089 (от 2017 года), который заменил RFC 1738 (1994) в аспектах URI файла.
ComFreek
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.