Чтобы понять, что такое mod_rewrite, вам сначала нужно понять, как работает веб-сервер. Веб-сервер отвечает на HTTP-запросы . HTTP-запрос на самом базовом уровне выглядит так:
GET /foo/bar.html HTTP/1.1
Это простой запрос браузера к веб-серверу, запрашивающий у него URL /foo/bar.html
. Важно подчеркнуть, что он не запрашивает файл , он запрашивает просто произвольный URL. Запрос также может выглядеть так:
GET /foo/bar?baz=42 HTTP/1.1
Это такой же действительный запрос на URL, и более очевидно, что он не имеет ничего общего с файлами.
Веб-сервер - это приложение, которое прослушивает порт, принимает HTTP-запросы, поступающие через этот порт, и возвращает ответ. Веб-сервер полностью свободен отвечать на любой запрос любым способом / любым способом, который вы настроили для его ответа. Этот ответ не является файлом, это HTTP-ответ, который может иметь или не иметь ничего общего с физическими файлами на любом диске. Веб-сервер не обязательно должен быть Apache, существует множество других веб-серверов, которые представляют собой просто программы, которые работают постоянно и подключены к порту, который отвечает на HTTP-запросы. Вы можете написать его сами. Этот абзац был призван отвлечь вас от любого представления о том, что URL-адреса напрямую равны файлам, что действительно важно понять. :)
Конфигурация по умолчанию большинства веб-серверов заключается в поиске файла, соответствующего URL-адресу на жестком диске. Если корень документа сервера установлен, скажем, на /var/www
, он может проверить, /var/www/foo/bar.html
существует ли файл, и обслужить его, если это так. Если файл заканчивается на «.php», он вызовет интерпретатор PHP, а затем вернет результат. Вся эта ассоциация полностью настраивается; файл не обязательно должен заканчиваться на «.php», чтобы веб-сервер мог запустить его через интерпретатор PHP, а URL-адрес не должен соответствовать какому-либо конкретному файлу на диске, чтобы что-то произошло.
mod_rewrite - это способ переписать внутреннюю обработку запросов. Когда веб-сервер получает запрос URL-адреса /foo/bar
, вы можете переписать этот URL-адрес во что-то другое, прежде чем веб-сервер будет искать файл на диске, соответствующий ему. Простой пример:
RewriteEngine On
RewriteRule /foo/bar /foo/baz
Это правило гласит, что всякий раз, когда запрос соответствует «/ foo / bar», переписывайте его в «/ foo / baz». Затем запрос будет обработан так, как если бы /foo/baz
он был запрошен. Это можно использовать для различных эффектов, например:
RewriteRule (.*) $1.html
Это правило соответствует чему-либо ( .*
) и захватывает его ( (..)
), а затем перезаписывает его, добавляя «.html». Другими словами, если это /foo/bar
был запрошенный URL, он будет обработан так, как если /foo/bar.html
бы был запрошен. См. Http://regular-expressions.info для получения дополнительной информации о сопоставлении, захвате и замене регулярных выражений.
Еще одно часто встречающееся правило:
RewriteRule (.*) index.php?url=$1
Это, опять же, сопоставляет что-либо и перезаписывает его в файл index.php с первоначально запрошенным URL-адресом, добавленным в url
параметр запроса. То есть, для любого и всех поступающих запросов выполняется файл index.php, и этот файл будет иметь доступ к исходному запросу $_GET['url']
, поэтому он может делать с ним все, что захочет.
Сначала вы помещаете эти правила перезаписи в файл конфигурации вашего веб-сервера . Apache также позволяет * помещать их в файл, который называется .htaccess
в корне вашего документа (то есть рядом с вашими .php файлами).
* Если это разрешено основным файлом конфигурации Apache; это необязательно, но часто включается.
Что mod_rewrite ничего не делать
mod_rewrite не делает все ваши URL "красивыми" волшебным образом. Это распространенное заблуждение. Если у вас есть эта ссылка на вашем веб-сайте:
<a href="https://stackoverflow.com/my/ugly/link.php?is=not&very=pretty">
mod_rewrite ничего не может сделать, чтобы сделать это красивым. Чтобы сделать эту ссылку красивой, вам необходимо:
Измените ссылку на красивую ссылку:
<a href="https://stackoverflow.com/my/pretty/link">
Используйте mod_rewrite на сервере, чтобы обработать запрос к URL-адресу, /my/pretty/link
используя любой из описанных выше методов.
(Можно использовать mod_substitute
вместе для преобразования исходящих HTML-страниц и содержащихся в них ссылок. Хотя обычно это требует больше усилий, чем просто обновление ваших HTML-ресурсов.)
Mod_rewrite может многое сделать, и вы можете создать очень сложные правила сопоставления, включая объединение нескольких перезаписей, проксирование запросов к совершенно другой службе или машине, возвращение определенных кодов состояния HTTP в качестве ответов, перенаправление запросов и т. Д. Это очень мощное средство, которое может использоваться для Отлично, если вы понимаете фундаментальный механизм HTTP-запроса-ответа. Это не автоматически делает ваши ссылки довольно.
См. Официальную документацию для всех возможных флагов и опций.