Введение
Модуль Apache mod_rewrite
позволяет более аккуратно переписывать URL-адреса, переводя удобочитаемые пути в строки запроса, совместимые с кодом. Это также позволяет вам переписывать URL-адреса в зависимости от условий.
Файл .htaccess
позволяет создавать и применять правила перезаписи без доступа к файлам конфигурации сервера. Поместив файл .htaccess
в корень вашего веб-сайта, вы можете управлять перезаписью по сайту или по каталогу.
В этом руководстве вы включите mod_rewrite
и используете файлы .htaccess
для создания базового перенаправления URL-адресов, а затем изучите несколько расширенных вариантов использования.
Если вы хотите установить mod_rewrite для Apache на удаленном сервере, продолжайте чтение, в противном случае пропустите первый абзац «Подключение к серверу» и читайте следующий.
Подключение к серверу
Чтобы получить доступ к серверу, вам нужно знать IP-адрес. Вам также потребуется ваше имя пользователя и пароль для аутентификации. Чтобы подключиться к серверу как root, введите следующую команду:
ssh root@IP_DEL_SERVER
Далее вам нужно будет ввести пароль пользователя root.
Если вы не используете пользователя root, вы можете войти под другим именем пользователя с помощью той же команды, а затем изменить root на свое имя пользователя:
ssh nome_utente@IP_DEL_SERVER
Затем вам будет предложено ввести пароль пользователя.
Стандартный порт для подключения по ssh — 22, если ваш сервер использует другой порт, вам нужно будет указать его с помощью параметра -p, затем введите следующую команду:
ssh nome_utente@IP_DEL_SERVER -p PORTA
Предпосылки
Чтобы следовать этому руководству, вам понадобятся:
- Сервер Ubuntu 20.04 LTS Focal Fossa, настроенный в соответствии с руководством по начальной настройке сервера Ubuntu 20.04, включая пользователя sudo без полномочий root и брандмауэр.
- Apache был установлен в соответствии с шагом 1 инструкции по установке стека Linux, Apache, MySQL, PHP (LAMP) в Ubuntu 20.04.
Активируйте модуль mod_rewrite
Чтобы Apache понял правила перезаписи, мы должны сначала активировать mod_rewrite
. Он уже установлен по умолчанию, но отключен при установке Apache по умолчанию. Используйте команду a2enmod
для включения модуля:
sudo a2enmod rewrite
Это активирует модуль или уведомит вас о том, что модуль уже включен. Чтобы эти изменения вступили в силу, перезапустите Apache.
sudo systemctl restart apache2
mod_rewrite
теперь полностью включен. На следующем шаге мы настроим файл .htaccess
, который будем использовать для определения правил перезаписи для перенаправлений.
Настройте файл.htaccess
Файл .htaccess
позволяет нам изменять наши правила перезаписи без доступа к файлам конфигурации сервера. По этой причине .htaccess
необходим для безопасности вашего веб-приложения. Точка перед именем файла гарантирует, что файл скрыт.
Примечание..htaccess
официальная документация Apache.htaccess.htaccess.htaccess
Прежде чем вы начнете использовать файлы .htaccess
, вам необходимо настроить и защитить некоторые другие параметры.
По умолчанию Apache запрещает использование файла .htaccess
для применения правил перезаписи, поэтому сначала необходимо разрешить изменения в файле. Откройте файл конфигурации Apache по умолчанию с помощью nano
или вашего любимого текстового редактора:
sudo nano /etc/apache2/sites-available/000-default.conf
Внутри этого файла вы найдете блок <VirtualHost *:80>
, начиная с первой строки. Внутри этого блока добавьте следующий новый блок, чтобы ваш файл конфигурации выглядел следующим образом. Убедитесь, что все блоки имеют правильный отступ:
Сохраните и закройте файл. Чтобы эти изменения вступили в силу, перезапустите Apache:
sudo systemctl restart apache2
Теперь создайте файл .htaccess
в файле webroot:
sudo nano /var/www/html/.htaccess
Добавьте эту строку в начало нового файла, чтобы активировать механизм перезаписи:
Сохраните файл и выйдите.
Теперь у нас есть рабочий файл .htaccess
, который мы можем использовать для управления правилами маршрутизации нашего веб-приложения. На следующем шаге мы создадим образцы файлов веб-сайта, которые будем использовать для демонстрации правил перезаписи.
Настроить перезапись URL
Здесь мы настроим базовую перезапись URL-адресов, которая преобразует красивые URL-адреса в фактические пути к страницам. В частности, мы разрешим пользователям входить в систему, но отобразим страницу с именем http://your_server_ip/aboutabout.html
.
Начните с создания файла about.html
в корневом каталоге:
sudo nano /var/www/html/about.html
Скопируйте следующий код HTML в файл, затем сохраните и закройте его:
Вы можете получить доступ к этой странице по адресу http://your_server_ip/about.html
, но учтите, что если вы попытаетесь получить доступ к http://your_server_ip/about
, вы увидите ошибку 404 Not Found. Чтобы получить доступ к странице с помощью /about
, мы создадим правило перезаписи.
Все RewriteRules
следуют этому формату:
RewriteRule pattern substitution [flags]
RewriteRule
— указывает директиву.pattern
- это регулярное выражение, которое соответствует нужной строке из URL-адреса, который зритель набирает в браузере.substitution
- это фактический путь URL, который является путем к файловому серверу Apache.flags
- это необязательные параметры, которые могут изменить поведение правила.
Давайте создадим наше правило перезаписи URL. Откройте файл .htaccess
:
sudo nano /var/www/html/.htaccess
После первой строки добавьте выделенный пункт RewriteRule
и сохраните файл:
В этом случае ^about$
— это шаблон, about.html
— замена, а [NC]
— флаг. В нашем примере используются некоторые символы со специальным значением:
^
— указывает на начало URL послеyour_server_ip/
.$
— указывает на конец URL-адреса.about
- соответствует строке "about".about.html
— это фактический файл, к которому обращается пользователь.[NC]
- флаг, делающий правило нечувствительным к регистру.
Теперь вы можете получить доступ к http://your_server_ip/aboutabout.html
в своем браузере. Фактически, с приведенным выше правилом следующие URL-адреса будут указывать на:
http://your_server_ip/about
, из-за определения правила.http://your_server_ip/About
, потому что правило не чувствительно к регистру.http://your_server_ip/about.html
, потому что правильное исходное имя файла всегда будет работать.
Однако следующее не будет работать:
http://your_server_ip/about/
, потому что в правиле явно указано, что послеabout
не может быть ничего, так как послеabout
стоит символ$
.http://your_server_ip/contact
, потому что он не будет соответствовать строкеabout
в правиле.
Теперь у вас есть рабочий файл .htaccess
с базовым правилом, которое вы можете изменить и расширить в соответствии со своими потребностями. В следующих разделах мы покажем еще два примера часто используемых директив.
Упростите строки запроса с помощью RewriteRule
Веб-приложения часто используют строки запроса, которые добавляются к URL-адресу с помощью вопросительного знака ( ?
) после адреса. Отдельные параметры разделяются амперсандом ( &
). Строки запроса можно использовать для передачи дополнительных данных между отдельными страницами приложения.
Например, страница результатов поиска, написанная на PHP, может использовать такой URL-адрес, как http://example.com/results.php?item=shirt&season=summer
. В этом примере в сценарий приложения result.php
передаются два дополнительных параметра: item
со значением shirt
и season
со значением summer
. Приложение может использовать информацию строки запроса, чтобы создать правильную страницу для посетителя.
Правила перезаписи Apache часто используются для упрощения ссылок, таких же длинных и неприглядных, как и предыдущие, в понятные URL -адреса, которые легче набирать и интерпретировать визуально. В этом примере мы хотели бы упростить ссылку из предыдущего примера и сделать ее похожей на http://example.com/shirt/summer
. Значения параметров shirt
и summer
по-прежнему находятся в адресе, но без строки запроса и имени скрипта.
Вот правило реализации этого механизма:
RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA]
Значение shirt/summer
явно соответствует запрошенному адресу, и вместо этого Apache получает указание обслуживать results.php?item=shirt&season=summer
.
Флаги [QSA]
обычно используются в правилах перезаписи. Они говорят Apache добавить любые дополнительные строки запроса к обслуживаемому URL-адресу, поэтому, если посетитель введет http://example.com/shirt/summer?page=2
, сервер ответит results.php?item=shirt&season=summer&page=2
. Без него лишняя строка запроса будет удалена.
Хотя этот метод позволяет достичь желаемого эффекта, в правиле закодировано и название статьи, и время года. Это означает, что правило не будет работать для других элементов, таких как pants
или времена года, например winter
.
Чтобы сделать правило более общим, мы можем использовать регулярные выражения для сопоставления частей исходного адреса и использовать эти части в схеме замены. После этого измененное правило будет выглядеть следующим образом:
RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]
Первый набор регулярных выражений в круглых скобках сопоставляет строку, содержащую буквенно-цифровые символы и числа, такие как shirt
или pants
, и сохраняет соответствующий фрагмент как переменную $1
. Вторая группа регулярных выражений в круглых скобках точно соответствует summer
, winter
, fall
или spring
таким же образом и сохраняет соответствующий фрагмент как $2
.
Соответствующие фрагменты затем используются в результирующем URL-адресе в переменных item
и season
вместо ранее использовавшихся жестко запрограммированных значений shirt
и summer
.
Приведенный выше код преобразует, например, http://example.com/pants/summer
в http://example.com/results.php?item=pants&season=summer
. Этот пример также является доказательством будущего, позволяя вам правильно переписать несколько статей и сезонов, используя одно правило.
Добавьте условия с логикой, используя RewriteConds
Правила перезаписи не обязательно всегда оцениваются одно за другим без ограничений. Директива RewriteCond
позволяет нам добавлять условия к нашим правилам перезаписи, чтобы контролировать, когда правила обрабатываются. Все условия RewriteConds
соответствуют следующему формату:
Общая структура RewriteCond:
RewriteCond TestString Condition [Flags]
RewriteCond
— указывает директивуRewriteCond
.TestString
— это строка для проверки.Condition
- это модель или условие для соответствия.Flags
— это необязательные параметры, которые могут изменять условия и правила оценки.
Если RewriteCond
возвращает значение true, следующее RewriteRule
будет рассмотрено немедленно. В противном случае правило будет удалено. Можно использовать несколько RewriteCond
один за другим, и при поведении по умолчанию все они должны оцениваться как истинные, чтобы следующее правило учитывалось.
Например, допустим, вы хотите перенаправить все запросы к несуществующим файлам или каталогам на вашем сайте на домашнюю страницу вместо отображения стандартной страницы ошибки 404 Not Found. Это может быть достигнуто с помощью следующих правил условия.
Перенаправить все запросы к несуществующим файлам и каталогам на домашнюю страницу:
RewriteCond %{REQUEST_FILENAME}!-f
RewriteCond %{REQUEST_FILENAME}!-d
RewriteRule. /[R=301]
С вышеизложенным:
%{REQUEST_FILENAME}
- строка для проверки. В данном случае это имя запрошенного файла, которое является системной переменной, доступной для каждого запроса.-f
— это встроенное условие, которое проверяет, существует ли запрошенное имя на диске и является ли оно файлом.!
является оператором отрицания. Комбинированный!-f
возвращает true, только если указанное имя не существует или не является файлом.- Аналогично
!-d
возвращает true, только если указанное имя не существует или не является каталогом.
Последняя строка RewriteRule
будет действовать только для запросов к несуществующим файлам или каталогам. Само RewriteRule
очень простое. Дело .
в шаблоне соответствует чему угодно, и переопределение направляет каждый запрос в корень /
веб-сайта.
Кроме того, флаг [R=301]
указывает Apache вернуть браузеру код ответа HTTP 301 Moved Permanently
, чтобы браузер знал, что перенаправление произошло, и явно извлекает корень веб-сайта вместо запрошенного URL-адреса с отражением изменения. в адресной строке браузера.
Без этого флага Apache вернул бы содержимое корня веб-сайта, но браузер по-прежнему считал бы, что URL запрошенной страницы существует, и отображал бы исходный запрошенный адрес в адресной строке.
Вывод
mod_rewrite
позволяет создавать удобочитаемые URL-адреса. В этом руководстве вы использовали директиву RewriteRule
для перенаправления URL-адресов, в том числе со строками запроса. Вы также написали условное перенаправление URL-адресов с помощью директивы RewriteCond
.