Как переписать URL-адреса с помощью mod_rewrite для Apache в Ubuntu 20.04

12 set 2022 7 min di lettura
Как переписать URL-адреса с помощью mod_rewrite для Apache в Ubuntu 20.04
Indice dei contenuti

Введение

Модуль 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

Предпосылки

Чтобы следовать этому руководству, вам понадобятся:

Активируйте модуль 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>, начиная с первой строки. Внутри этого блока добавьте следующий новый блок, чтобы ваш файл конфигурации выглядел следующим образом. Убедитесь, что все блоки имеют правильный отступ:

<VirtualHost *:80>
 <Directory /var/www/html>
 Options Indexes FollowSymLinks
 AllowOverride All
 Require all granted
 </Directory>...
 </VirtualHost>
/etc/apache2/сайты-доступны/000-default.conf

Сохраните и закройте файл. Чтобы эти изменения вступили в силу, перезапустите Apache:

sudo systemctl restart apache2

Теперь создайте файл .htaccess в файле webroot:

sudo nano /var/www/html/.htaccess

Добавьте эту строку в начало нового файла, чтобы активировать механизм перезаписи:

RewriteEngine on
/var/www/html/.htaccess

Сохраните файл и выйдите.

Теперь у нас есть рабочий файл .htaccess, который мы можем использовать для управления правилами маршрутизации нашего веб-приложения. На следующем шаге мы создадим образцы файлов веб-сайта, которые будем использовать для демонстрации правил перезаписи.

Настроить перезапись URL

Здесь мы настроим базовую перезапись URL-адресов, которая преобразует красивые URL-адреса в фактические пути к страницам. В частности, мы разрешим пользователям входить в систему, но отобразим страницу с именем http://your_server_ip/aboutabout.html.

Начните с создания файла about.html в корневом каталоге:

sudo nano /var/www/html/about.html

Скопируйте следующий код HTML в файл, затем сохраните и закройте его:

<html>
 <head>
 <title>About Us</title>
 </head>
 <body>
 <h1>About Us</h1>
 </body>
 </html>
/var/www/html/about.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 и сохраните файл:

RewriteEngine on
 RewriteRule ^about$ about.html [NC]
/var/www/html/.htaccess

В этом случае ^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.

Buy me a coffeeBuy me a coffee

Supportaci se ti piacciono i nostri contenuti. Grazie.

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.