Перенаправление 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.

so был загружен в Apache.

Для ОС 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 или в файле .

(.*)$ https://www.domain.com/$1 [R=301,L]

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

для открытия по https (443 порт) и настройки редиректа:

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 вам нужно создать две секции

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

301 редирект. Например был изменен адрес страницы или название каталога, изменилось имя домена и т. д. Эти вопросы легко решаются с помощью .htaccess. Но при этом стоит понимать, что иногда правила переадресации и формирования URL адресов формирует сама CMS (система управления сайтом) и в таком случае не всегда есть возможность решить определенные задачи при помощи .htaccess.

Для редиректа можно использовать директивы Redirect, RedirectMatch и возможности модуля mod_rewrite.

Redirect — это самая простая директива для создания редиректа, если вам просто нужно перенаправить посетителей с одного адреса на другой, этот метод вполне подходит.
RedirectMatch — является более продвинутой директивой для перенаправлений, чем Redirect. В ней можно использовать регулярные выражения и обратные связи.
mod_rewrite — самое мощное средство не только для редиректа, но и для других видов преобразования. Для построения правил с помощью mod_rewrite используются директивы RewriteCond и RewriteRule.

Рассмотрим типичные виды перенаправлений и их решение при помощи указанных выше директив

C одной страницы сайта на другую

Часто бывает так, что был изменен адрес целевой страницы и очень не хочется, что бы посетителям при обращении к старому адресу отдавалась 404 ошибка. (.*)$ /$1/ [R=301,L]

Это самый простой пример, сюда можно еще добавить проверку 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.