В браузерах игнорируются косые черты в URL-адресах?

Я заметил, что и Chrome, и Firefox игнорируют косые черты между словами в URL-адресе.

Итак, github.com/octocat/hello-world кажется эквивалентным github.com//////octocat////hello-world.

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

Ответы

Ответ 1

Разделители путей определяются как одна косая черта в соответствии с this. (Поиск компонента пути)

Обратите внимание, что браузер обычно не изменяет URL. Браузеры могли бы добавить / в конце URL, но в вашем случае URL-адрес с дополнительной косой чертой просто отправляется в запросе, так что это сервер вместо игнорирования косой черты.

Кроме того, посмотрите:

Даже если это удобно для вас, обычно не рекомендуется. Кроме того, кэширование также может быть затронуто (источник):

Поскольку и ваш браузер, и серверные кешируют отдельные страницы (в соответствии с их настройками кэширования), запрос одного и того же файла несколько раз с помощью немного разных URI может повлиять на кеширование (в зависимости от реализации сервера и клиента).

Ответ 2

Пустой сегмент пути действителен в соответствии с спецификацией:

path          = path-abempty    ; begins with "/" or is empty
              / path-absolute   ; begins with "/" but not "//"
              / path-noscheme   ; begins with a non-colon segment
              / path-rootless   ; begins with a segment
              / path-empty      ; zero characters

path-abempty  = *( "/" segment )
path-absolute = "/" [ segment-nz *( "/" segment ) ]
path-noscheme = segment-nz-nc *( "/" segment )
path-rootless = segment-nz *( "/" segment )
path-empty    = 0<pchar>

segment       = *pchar
segment-nz    = 1*pchar
segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
              ; non-zero-length segment without any colon ":"

pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"

В последнем URI https://github.com//////octocat////hello-world путь //////octocat////hello-world будет состоять из:

  • //////octocat////hello-world: путь запрещен
    • /: сегмент
    • /: сегмент
    • /: сегмент
    • /: сегмент
    • /: сегмент
    • /octocat: segment-nz
    • /: сегмент
    • /: сегмент
    • /: сегмент
    • /hello-world: segment-nz

Удаление этих пустых сегментов пути составило бы совершенно другой URI. Как сервер будет обрабатывать эти пустые сегменты пути, это совершенно другой вопрос.

Ответ 3

На самом деле браузеры не игнорируют их, они передают их на веб-сервер в HTTP-запросе. Это сервер, который может решить игнорировать их, но технически умножающие косые черты приводят к другому URL-адресу.

W3.org указывает, что часть пути URL-адреса состоит из "сегментов пути", разделенных символом /, а сегмент пути состоит из нуля или более "единиц URL" (символов), кроме / и ?, поэтому допустимы пустые сегменты пути, что вы получаете, когда вы дублируете косые черты.

Подробнее см. http://www.w3.org/TR/url-1/

Ответ 4

На самом деле браузеры не игнорируют сокращения между URL-адресами.

Если вы используете document.URL в (на стороне клиента) JavaScript, вы получаете URL-адрес с повторяющимися "///".

Аналогично в (на стороне сервера) PHP, при использовании $_SERVER['REQUEST_URI'] вы получаете URL-адрес с повторяющимися "///".

Это сервер, например Apache, который фактически перенаправляет на нужную страницу без URL. В Apache вы можете писать правила в файле .htaccess, чтобы не перенаправлять на страницу с игнорированием///s.