Как работает переписывание URL?

Как веб-сервер реализует механизм перезаписи URL-адресов и изменяет адресную строку браузеров?
Я не запрашиваю конкретную информацию для настройки apache, nginx, lighthttpd или другого!
Я хотел бы знать, какая информация отправляется клиентам, когда серверы хотят переписать 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, что новая страница. Затем клиент запрашивает эту страницу. Поэтому адрес в браузере меняется!

Процесс

Процесс остается тем же и хорошо описывается этой диаграммой:

enter image description here

Примечание. Каждое переписывание/перенаправление вызывает новый вызов правил перезаписи (с исключениями 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.