Как веб-сервер реализует механизм перезаписи URL-адресов и изменяет адресную строку браузеров?
Я не запрашиваю конкретную информацию для настройки apache, nginx, lighthttpd или другого!
Я хотел бы знать, какая информация отправляется клиентам, когда серверы хотят переписать URL-адрес?
Как работает переписывание URL?
Ответ 1
Вы говорите о перезаписывании на стороне сервера (например, Apache mod-rewrite)? Для них адресная строка обычно не изменяется (если не выполняется перенаправление). Или вы говорите о перенаправлениях? Это делается путем ответа сервера HTTP-кодом (301, 302 или 307) и местоположением в HTTP-заголовке.
Ответ 2
Существует два типа поведения.
Один переписывается, другой перенаправляется.
Rewrite
Сервер выполняет подстановку для себя, делая URL как http://example.org/my/beatuful/page
понимаемым как http://example.org/index.php?page=my-beautiful-page
С переписыванием клиент ничего не видит, и перенаправление является только внутренним. Изменений URL в браузере нет, просто сервер понимает его по-другому.
Перенаправление
Сервер обнаруживает, что адрес не нужен сервером. http://example.org/page1
переместился на http://example.org/page2
, поэтому он сообщает браузеру с кодом HTTP 3xx, что новая страница. Затем клиент запрашивает эту страницу. Поэтому адрес в браузере меняется!
Процесс
Процесс остается тем же и хорошо описывается этой диаграммой:
Примечание. Каждое переписывание/перенаправление вызывает новый вызов правил перезаписи (с исключениями IIRC)
RewriteCond %{REDIRECT_URL} !^$
RewriteRule .* - [L]
может стать полезным для остановки циклов. (Так как он не переписывает, когда это произошло уже однажды).
Ответ 3
Переписывание URL-адресов может преобразовывать URL-адреса исключительно на стороне сервера. Это позволяет разработчикам веб-приложений получать доступ к веб-ресурсам из нескольких URL-адресов.
Например, пользователь может запросить http://www.example.com/product/123
, но благодаря перезаписи на самом деле выполняется ресурс от http://www.example.com/product?id=123
. Обратите внимание: нет необходимости в изменении адреса, отображаемого в браузере.
При желании адрес может быть изменен. Для этого аналогичное сопоставление, как указано выше, происходит на сервере, но вместо того, чтобы возвращать ресурс клиенту, сервер отправляет перенаправление (301 или 302 HTTP-код) обратно клиенту для переписанного URL.
В приведенном выше примере это может выглядеть так:
Запрос клиента
GET /product/123 HTTP/1.1
Host: www.example.com
Ответ сервера
HTTP/1.1 302 Found
Location: http://www.example.com/product?id=123
В этот момент браузер выпустит новый GET
запрос для URL-адреса в заголовке Location
.
Ответ 4
Существуют две формы "URL rewrite": те, которые выполняются исключительно на сервере, и те, которые перенаправлены.
Если это чисто внутри сервера, это внутренний вопрос и только вопросы, касающиеся механизма отправки, реализованного на сервере. Например, в Apache HTTPD, mod_rewrite может сделать это.
Если это перенаправление, в ответ отправляется код состояния, подразумевающий перенаправление, а также заголовок Location
, указывающий, к какому URL следует перенаправить браузер (это должен быть абсолютный URL). mod_rewrite
также может сделать это, с [R].
Код состояния обычно 302 (найдено), но он может быть настроен для других кодов (например, 301 или 307).
Другое довольно частое использование (часто незаметное, потому что обычно по умолчанию в Apache HTTPD) является перенаправление на URL с конечной косой чертой в каталоге. Это реализовано mod_dir:
Выдается редирект "trailing slash" когда сервер получает запрос на URL
http://servername/foo/dirname
где dirname - это каталог. Каталоги требуют концевой косой черты, поэтому mod_dir выдает перенаправление наhttp://servername/foo/dirname/
.
Ответ 5
У Джеффа Этвуда была отличная статья: http://www.codinghorror.com/blog/2007/02/url-rewriting-to-prevent-duplicate-urls.html
Как веб-сервер реализует механизм перезаписи URL-адресов и изменяет адресную строку браузеров?
Переписывание и пересылка URL - это две совершенно разные вещи. Сервер не имеет контроля над вашим браузером, поэтому он не может изменить URL вашего браузера, но он может попросить вашего браузера перейти на другой URL-адрес. Когда ваш браузер получает ответ от сервера, он полностью зависит от вашего браузера, чтобы определить, что делать с этим ответом: он может следовать за перенаправлением, игнорировать его или быть действительно средним и спамом сервера до тех пор, пока сервер не сдастся. Нет никакого "механизма", который сервер использует для изменения адреса, это просто протокол (HTTP 1.1), который выполняется сервером, когда определенный ресурс перемещен в другое место, таким образом, ответы 3xx.