В браузерах игнорируются косые черты в 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.