Что означает двойная косая черта в URL-адресах?


Что именно означают двойные косые черты, часто встречающиеся в URL-адресах?

Например:

  • http://www.example.com/A/B//C/

Пожалуйста, обратите внимание, что я не имею в виду начало сразу после http:.

Author: Simon Hayter, 2011-01-27

4 answers

Это ошибка в коде программистов/разработчиков. Если вы сравните эти два URL-адреса:

  • http://www.example.com/A/B/C/
  • http://www.example.com/A/B//C/

Они выглядят по-разному, но если бы вы посетили любой из них, оба они работали бы в большинстве современных браузеров.

Это то, что вы хотите исправить. Если у вас есть двойная косая черта, это может сбить с толку веб-поисковиков Google и заставить их думать, что существует 2 версии страницы.

 35
Author: Ben Hoffman, 2016-05-05 18:20:27

Как упоминалось @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.

 36
Author: josh3736, 2017-04-13 12:33:17

Двойная косая черта имеет значение, когда она используется в URL-адресах ресурсов. Например, когда это пользователь в CSS для URL-адреса фонового изображения:

.classname {
    background : url("//example.com/a/b/c/d.png");
}

Здесь это означает, что это фоновое изображение извлекается из другого домена, отличного от домена данной веб-страницы. Или, другими словами, http:// может быть записано как просто // при использовании этого в URL-адресе ресурса.

Но эта двойная косая черта между URL-адресами (например: /a//b/c/d.htm) не имеет никакого значения.

 4
Author: Alan Joseph, 2016-05-05 18:21:57

Как уже упоминалось, некоторые серверы настроены так, чтобы игнорировать двойную косую черту в URL-пути, но статический хостинг Amazon S3 этого не сделает. Если вы хотите обрабатывать/игнорировать их в этом случае, вы можете использовать Правила перенаправления на панели свойств.

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

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals>/</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <ReplaceKeyPrefixWith/>
    </Redirect>
  </RoutingRule>
</RoutingRules>

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

 2
Author: orlade, 2016-05-05 18:26:34