Что означает двойная косая черта в URL-адресах?
Что такое двойные слэши, которые часто встречаются в среднем URL?
Например:
-
http://www.example.com/A/B//C/
Обратите внимание, что я не говорю о начале сразу после http:
.
4 ответа
Это ошибка в коде программистов /разработчиков. Если вы сравниваете эти два 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
Хост: 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 = * pchar * (";" param)
param = * pchar
pchar = unreserved | сбежал |
":" | "@" | "& Амп;" | "=" | "+" | "$" | ""
Итак, /a /b /c /
состоит из трех сегментов: «a», «b» и «c»; /a /b //c /
состоит из четырех: «a», «b», «» (пустая строка) и «c». Является ли пустая строка допустимым каталогом файловой системы, является деталью платформы сервера. (И логически, это означает, что браузеры действительно работают правильно при анализе относительных URL-адресов с родительскими компонентами пути - в моем примере они проходят через каталог «c» и «», оставляя нас запросить style.css
с "b".)
Если вы используете Apache с mod_rewrite
, есть довольно простое исправление :
# удалить несколько слэшей в любом месте URL-адреса
RewriteCond% {REQUEST_URI} ^ (. *) //(. *) $
RewriteRule. % 1 /% 2 [R = 301, L]
Это приведет к перенаправлению HTTP 301 Moved Permently
, чтобы любые двойные косые черты были удалены из 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 >
& Lt; RoutingRule >
& Lt; & Состояние GT;
& Lt; KeyPrefixEquals > /& л; /KeyPrefixEquals >
& Lt; /Состояние >
& Lt; Перенаправление >
& Lt; ReplaceKeyPrefixWith />
& Lt; /Перенаправление >
& Lt; /RoutingRule >
& Lt; /RoutingRules >
Возможно, вы также можете найти и заменить их повсюду, но этого было достаточно для меня.