Перенаправление Apache и Nginx | FirstVDS
Перенаправления (редиректы) используются в тех случаях, когда вам необходимо, чтобы перенаправить пользователи сайта на нужный адрес.
В данной статье расскажем, как настраивать перенаправления в Apache и Nginx — одних из самых популярных веб-серверов в мире.
- Apache
- Подключения модуля mod_rewrite
- Правила Redirect
- Redirect или RedirectPermanent
- RedirectMatch
- RewriteRule
- Редирект с одного сайта на другой
- Редирект с www на без www
- Редирект с без www на www
- Перенаправление домена с https на http
- Перенаправление домена с http на https
- Nginx
- Редирект 301 с www.domain.com на domain.com
- Редирект 301 с domain.com на www.domain.com
- Редирект 301 с https на http
- Редирект 301 с http на https
Apache
Подключения модуля mod_rewrite
Для включения перенаправления средствами Apache достаточно, чтобы модуль mod_rewrite.
Для ОС Ubuntu, Debian:
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
Для ОС CentOS, RedHat, AlmaLinux нужно проверить, чтобы в файле /etc/httpd/conf.modules.d/00-base.conf
была строка:
LoadModule rewrite_module modules/mod_rewrite.so
Если ее нет, то нужно добавить ее в конец файла. Если она закомментирована (в начале строки знак #
) — нужно раскомментировать строку.
Для того чтобы директивы mod_rewrite можно было использовать в .htaccess, надо в конфигурационном файле Apache, в соответствующем разделе <Directory /путь/до/директории>
AllowOverride all
После внесения изменений в конфигурационный файл Apache, для вступления в силу этих изменений, нужно перезапустить веб сервер.
Для ОС Ubuntu, Debian:
systemctl restart apache2
Для ОС CentOS, RedHat, AlmaLinux:
systemctl restart httpd
В .htaccess для работы перенаправления нужно указать следующую директиву:
RewriteEngine On
Правила Redirect
Эти директивы вы можете прописывать как в конфиге Apache для нужного virtualhost, так и в файле . htaccess.
Redirect или RedirectPermanent
Главный недостаток данных правил заключается в том, что для каждого адреса необходимо прописывать новое правило. Если необходимо сделать несколько редиректов, то каждый новый редирект пишется с новой строки.
Redirect 301 /old-page.html http://new-domain.ru/new-page.html
или
Redirect permanent /old-page.html http://new-domain.ru/new-page.html
Для перенаправления всех запросов на другой сайт вы можете использовать следующую конструкцию:
Redirect 301 / http://new-domain.ru/
или
Redirect permanent / http://new-domain.ru/
RedirectMatch
Этот редирект отличается тем, что в нем можно использовать регулярное выражение. Например, при переносе сайта с Windows на Linux, необходимо сменить все ссылки с *.php на *.aspx:
RedirectMatch /(.*)\.aspx$ /$1.php
RewriteRule
Для работы данного модуля убедитесь в том, что включена опция FollowSymLinks, эту функцию нужно прописать в конфигурационном файле Apache или в файле .
Nginx
Модуль ngx_http_rewrite_module, необходимый для настройки перенаправлений, устанавливается автоматически вместе с Nginx.
Рекомендуется добавлять правила редиректа по одному, т.к. можно получить ошибку, либо циклическое перенаправление. Поэтому после каждого изменения конфигурационного файла нужно проверять его корректность командой:
nginx -t
Редирект 301 с www.domain.com на domain.com
Для Nginx вам нужно создать две секции server в конфигурационном файле, одну для домена с www, вторую для домена без www:
Секция server
для редиректа:
server { listen 80; server_name www.domain.com; return 301 $scheme://domain.com$request_uri; }
Секция server
, где находятся основные настройки домена:
server { listen 80; server_name domain.com; ..... }
После внесения изменений в конфигурационный файл Nginx, для вступления в силу этих изменений, нужно перезапустить веб сервер.
nginx -s reload
или
systemctl reload nginx
Редирект 301 с domain.com на www.domain.com
Для Nginx вам нужно создать две секции server в конфигурационном файле, одну для домена с www, вторую для домена без www:
Секция server
для редиректа:
server { listen 80; server_name domain.ru; return 301 http://www.$host$request_uri; }
Секция server
, где находятся основные настройки домена.
server { listen 80; server_name www.domain.com; ..... }
После внесения изменений в конфигурационный файл Nginx, для вступления в силу этих изменений, нужно перезапустить веб сервер.
nginx -s reload
или
systemctl reload nginx
Редирект 301 с https на http
Для Nginx вам нужно создать две секции server
в конфигурационном файле, одну для https (443 порт), вторую для http (80 порт).
Секция server
server { listen 443; server_name domain. ru www.domain.ru; return 301 http://$host$request_uri; }
Секция server
для открытия по http (80 порт), где находятся основные настройки домена.
server { listen 80; server_name www.domain.com; ..... }
После внесения изменений в конфигурационный файл Nginx, для вступления в силу этих изменений, нужно перезапустить веб сервер.
nginx -s reload
или
systemctl reload nginx
Редирект 301 с http на https
Для Nginx вам нужно создать две секции
в конфигурационном файле, одну для http (80 порт), вторую для https (443 порт).
Для нового домена в конф. файле nginx
Секция server
для открытия по http (80 порт) и настройки перенаправления:
server { listen 80; server_name domain.com www.domain.com; return 301 https://$host$request_uri; }
Секция server для открытия по https (443 порт), где находятся основные настройки домена.
server { listen IP. се.рве.ра:443; server_name www.domain.com; ..... }
Для существующего домена в конф. файле nginx
Если вы вносите изменения в существующую секцию конф. файла nginx делайте это так:
из основной секции домена удалите строку вида
listen IP.се.рве.ра:80;
и создайте новую секцию server такого вида:
server { listen 80; server_name domain.com www.domain.com; return 301 https://$host$request_uri; }
После внесения изменений в конфигурационный файл Nginx, для вступления в силу этих изменений, нужно его перезапустить так:
nginx -s reload
или
systemctl reload nginx
Редирект, переадресация или перенаправление
Одна из наиболее частых причин использования файла .htaccess, является потребность в перенаправлении посетителей сайта с одного адреса на другой, обычно это называют
Для редиректа можно использовать директивы Redirect, RedirectMatch и возможности модуля mod_rewrite.
RedirectMatch — является более продвинутой директивой для перенаправлений, чем Redirect. В ней можно использовать регулярные выражения и обратные связи.
mod_rewrite — самое мощное средство не только для редиректа, но и для других видов преобразования. Для построения правил с помощью mod_rewrite используются директивы RewriteCond и RewriteRule.
Рассмотрим типичные виды перенаправлений и их решение при помощи указанных выше директив
C одной страницы сайта на другую
Это самый простой пример, сюда можно еще добавить проверку URL адреса на содержание GET параметров, что бы c адреса вида /test?id=1&page=5 не было перенапрвления на /test/?id=1&page=5. И проверку на содержание расширения файла, что бы адреса вида /test.html не превращались в /test.html/.
RewriteCond %{QUERY_STRING} !.+
RewriteCond %{REQUEST_URI} !.
%{QUERY_STRING} — эта переменная сервера содержит GET параметры, «.+» — означает, что должен быть как минимум один символ, восклицательный знак указывает на несоответствие шаблону. То есть, если переменная %{QUERY_STRING} не содержит ни одного символа, выполняем правило.
%{REQUEST_URI} — эта переменная содержит запрошенный адрес, «!.» — не должен содержать точку. То есть, если в запросе нет точки, правило выполняем. Можно дополнительно уточнить расширения, если в этом есть необходимость:
RewriteCond %{REQUEST_URI} !. (.*)$ https://%{HTTP_HOST}/$1 [R=301,L]RewriteCond %{HTTP:SSL} !1
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L,R=301]
php — перенаправление против RedirectMatch
Задавать вопрос
спросил
Изменено 6 лет, 6 месяцев назад
Просмотрено 30 тысяч раз
Я новичок в этом сообществе, но много о нем слышал. Итак, я здесь сегодня, чтобы получить решение одного из моих вопросов, касающихся перенаправления 301 и перенаправления 301.
Я попытался перенаправить страницу 404, используя Redirect 301 что-то вроде этого
Redirect 301 /part1-url http://domain.com/part1-url/part2-url/part3-url.html
Это правило сработало как кошмар, после чего мой целевой URL-адрес начал вести себя неправильно, и повторяющаяся строка /part2-url/part3-url. html
была добавлена к моему целевому URL-адресу, который стал чем-то вроде —
http://domain. .com/part1-url/part2-url/part3-url.html/part2-url/part3-url.html/part2-url/part3-url.html/part2-url/part3-url.html/part2-url /part3-url.html/part2-url&id=part3-url.html&var=part2-url&var2=part3-url 9/part1-url$ http://domain.com/part1-url/part2-url/part3-url.html
и все заработало.
Я не могу понять, почему это произошло и как работал второй.
Буду очень признателен за помощь.
- php
- apache
- .htaccess
- перенаправление
- http-перенаправление
1
Перенаправление
предполагается для перенаправления всех URL-адресов , начиная со строки . Поскольку URL-адрес, на который вы перенаправляете, начинается с этой строки, естественно, вы сразу же перенаправляетесь снова.
RedirectMatch
перенаправляет URL-адреса, соответствующие регулярному выражению. Вы использовали $
, чтобы явно сопоставить конец URL-адреса как часть этого. Это означает, что «начать с» недостаточно.
1
Взято из Apache.
Перенаправление:
Директива Redirect сопоставляет старый URL-адрес с новым, запрашивая клиент для повторной загрузки ресурса в новом местоположении.
Старый URL-путь — это путь с учетом регистра (%-decoded), начинающийся с косая черта. Относительный путь не допускается.
Новый URL-адрес может быть либо абсолютным URL-адресом, начинающимся со схемы, либо имя хоста или URL-путь, начинающийся с косой черты. В этом последнем случае будут добавлены схема и имя хоста текущего сервера.
Тогда любой запрос, начинающийся с URL-пути, вернет перенаправление запрос к клиенту в местоположении целевого URL. Дополнительный информация о пути за пределами совпавшего URL-пути будет добавлена к целевой URL.
Источник: Apache Redirect
RedirectMatch
Эта директива эквивалентна Redirect, но использует регулярные выражения вместо простого сопоставления префиксов. Предоставленное регулярное выражение сопоставляется с URL-путем, и если оно совпадает, сервер заменяет любые совпадения в скобках в заданную строку и использует ее в качестве имени файла.
Источник: Apache RedirectMatch
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
apache — использование RedirectMatch с HTTP_HOST в пункте назначения
спросил
Изменено 1 год, 10 месяцев назад
Просмотрено 9(. *) https://%{HTTP_HOST}/$1
Я недавно задавал аналогичный вопрос, но, возможно, он был слишком многословным и не содержал направления для ответа: Перенаправление http-трафика на https в Apache без использования mod_rewrite
- apache
- http-redirect
- mod-alias
Если вы используете версию 2.4.19 или более позднюю, директива Redirect
имеет несколько неясную функцию: ее размещение внутри Location
или LocationMatch
активирует синтаксис выражения. 9(?<ПУТЬ>.*)>
Перенаправить «https://%{HTTP_HOST}%{env:MATCH_PATH}»
(Здесь обозначение ?
означает, что захват матча будет сохранен в переменной среды с именем MATCH_PATH
. Вот как мы можем использовать его позже в Redirect
.)
Это даже легче, если вы всегда перенаправляете, используя весь путь запроса, потому что вы можете полностью заменить группу захвата переменной REQUEST_URI
:
<Расположение "/"> Перенаправить "https://%{HTTP_HOST}%{REQUEST_URI}" местоположение>
Теперь проще поддерживать/понять, чем просто использовать mod_rewrite для этого случая? Возможно, нет. Но это вариант.
5
Нет, вы не можете использовать переменные этого типа с Redirect/RedirectMatch. Если вам нужны переменные, такие как %{HTTP_HOST}
, используйте mod_rewrite.
Примечание: я хвалю вас за то, что вы не пытаетесь использовать mod_rewrite сразу, потому что большинство людей будут использовать mod_rewrite даже для самых простых перенаправлений, что явно излишне и в большинстве случаев просто пытается излишне усложнить ситуацию.
1
Пишу для пользователей, которые могут столкнуться с тем же в будущем.
Не знаю, как вы добавляете записи vhost.
Я предполагаю, что записи этого виртуального хоста добавляются автоматически с помощью какого-то скрипта программирования. Используете ли вы VhostDirective с именем сервера?
<Виртуальный хост *:8080> Имя сервера example.domain.com
Если это так, то вы можете использовать то же значение домена для заполнения поля RedirectMatch.