Что означает двойная косая черта в URL-адресах?
Что именно означают двойные косые черты, часто встречающиеся в URL-адресах?
Например:
http://www.example.com/A/B//C/
Пожалуйста, обратите внимание, что я не имею в виду начало сразу после http:
.
4 answers
Это ошибка в коде программистов/разработчиков. Если вы сравните эти два URL-адреса:
-
http://www.example.com/A/B/C/
http://www.example.com/A/B//C/
Они выглядят по-разному, но если бы вы посетили любой из них, оба они работали бы в большинстве современных браузеров.
Это то, что вы хотите исправить. Если у вас есть двойная косая черта, это может сбить с толку веб-поисковиков Google и заставить их думать, что существует 2 версии страницы.
Как упоминалось @Randomben, двойная косая черта, скорее всего, является результатом какой-то ошибки.
То, что страница загружается, не имеет никакого отношения к браузеру, а скорее к тому, что сервер игнорирует дополнительную косую черту. Браузер не делает ничего особенного с дополнительными косыми чертами в URL-адресе, он просто отправляет их вместе с запросом:
GET /A/B//C/D HTTP/1.1
Host: www.example.com
...
Похоже, что текущие версии Apache и IIS будут игнорировать дополнительные косые черты при разрешении путь и верните документ, который был бы возвращен, если бы в URL-адресе не было лишних косых черт. Однако браузеры (я тестировал IE 8 и Chrome 9) путаются в любых относительных URL-адресах (содержащих компоненты родительского пути) ресурсов на странице, что приводит к плохим результатам. Например, если на странице есть:
<link rel="stylesheet" href="../../style.css" type="text/css" />
После загрузки страницы /a/b/c/
браузер запросит /a/style.css
. Но если - по какой-либо причине - запрашивается /a/b//c/
(и сервер игнорирует дополнительную косую черту), браузер будет в конечном итоге запрашивается /a/b/style.css
, которого не будет. Упс, страница выглядит уродливо.
(Этого, очевидно, не произойдет, если URL-адрес не содержит родительского компонента пути (..
) или является абсолютным.)
По моему мнению, Apache и IIS (и, возможно, другие) действуют неправильно , поскольку /a/b/c/
и /a/b//c/
технически представляют два разных ресурса. Согласно RFC 2396, каждая косая черта имеет значение:
path = [ abs_path | opaque_part ]
path_segments = segment *( "/" segment )
segment = *pchar *( ";" param )
param = *pchar
pchar = unreserved | escaped |
":" | "@" | "&" | "=" | "+" | "$" | ","
Итак, /a/b/c/
состоит из трех сегментов: "a", "b" и "c"; /a/b//c/
на самом деле состоит из четырех: "a", "b", "" (пустая строка) и "c". Является ли пустая строка допустимым каталогом файловой системы или нет, зависит от платформы сервера. (И логически это означает, что браузеры на самом деле работают правильно при анализе относительных URL–адресов с компонентами родительского пути - в моем примере они проходят мимо каталога "c" и каталога "", оставляя нам запрос style.css
из "b".)
Если вы используете Apache с mod_rewrite
, есть довольно простое исправление:
# remove multiple slashes anywhere in url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
Это приведет к перенаправлению HTTP 301 Moved Permanently
, так что любые двойные косые черты будут удалены из URL.
Двойная косая черта имеет значение, когда она используется в URL-адресах ресурсов. Например, когда это пользователь в CSS для URL-адреса фонового изображения:
.classname {
background : url("//example.com/a/b/c/d.png");
}
Здесь это означает, что это фоновое изображение извлекается из другого домена, отличного от домена данной веб-страницы. Или, другими словами, http://
может быть записано как просто //
при использовании этого в URL-адресе ресурса.
Но эта двойная косая черта между URL-адресами (например: /a//b/c/d.htm
) не имеет никакого значения.
Как уже упоминалось, некоторые серверы настроены так, чтобы игнорировать двойную косую черту в URL-пути, но статический хостинг Amazon S3 этого не сделает. Если вы хотите обрабатывать/игнорировать их в этом случае, вы можете использовать Правила перенаправления на панели свойств.
Если вы хотите игнорировать двойную косую черту после доменного имени, вы можете использовать что-то вроде этого:
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals>/</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyPrefixWith/>
</Redirect>
</RoutingRule>
</RoutingRules>
Вероятно, вы также можете найти и заменить их повсюду, но для меня этого было достаточно.