Щоб зрозуміти, що саме 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. Це автоматично не робить ваші посилання гарними.
Дивіться офіційну документацію для всіх можливих прапорів та опцій.