Nginx 301 редирект: Настраиваем переадресацию (Redirect 301) для nginx, apache и php – Как настраивать редиректы на веб-сервере NGINX 🔄

Как настроить 301 редирект (redirect) при помощи Nginx на VPS

Чтобы сделать редирект с помощью nginx, необходимо изменить файл конфигурации nginx.conf.

Если у вас настроены виртуальные хосты, файл конфигурации для каждого хоста нужно редактировать отдельно.

Редирект добавляется в секцию server в конфигурационном файле. Пример редиректа на https:

Редиректы на Nginx

Редирект с http на https-протокол

Если у вас подключен SSL-сертификат для домена, вам необходимо настроить https-протокол. Для редиректа с http на https в файл конфигурации необходимо добавить следующий код:

        server {
   #...
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
   #...
}
    

Редирект с https на http-протокол

Обратный пример конфигурации для редиректа с https на http:

        server {
   #...
  server_name  yourdomain.ru www.yourdomain.ru;
return 301 http://$server_name$request_uri;
   #...
}
    

Редирект с www на без www

        server {
   #...
if ($host ~* www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 permanent;
}
   #...
}
    

Редирект с без www на www

        server {
  #...
if ($host ~* ^[^.]+\.[^.]+$) {
    rewrite ^(.*)$ $scheme://www.$host$1 permanent;
}
   #...
}
    

Редирект для одной страницы

Если у вашей страницы изменился адрес, необходимо сделать 301 редирект на новый URL.

        server {
   #...
if ( $request_filename ~ oldpage.html/ ) {
rewrite ^ newpage.html permanent;}
   #...
}
    

Где oldpage.html — имя страницы с которой будет происходить редирект, а newpage.html имя страницы, на которую будет осуществляться редирект.

Редирект для папки

        server {
   #...
if ( $request_filename ~ oldfolder/.+ ) {
 rewrite ^(.*) newfolder/$1 permanent; }
   #...
}
    

Где oldfolder — имя старой папки, а newfolder — имя новой папки

Редирект с одного домена на другой

Чтобы осуществить редирект с одного домена на другой, необходимо добавить:

        server {
   #...

   rewrite ^ $scheme://www.new-yourdomain.ru;
   #...
}
    

Где www.new-yourdomain.ru — домен, куда будет осуществляться редирект.

Редирект на страницу без слеша в конце URL

        server {
   #...
   rewrite ^/(.*)/$ /$1 permanent;
   #...
}
    

Редирект на страницу со слешем в конце URL

        server {
   #...
  rewrite ^(.*[^/])$ $1/ permanent;
   #...
}
    

Перезагрузите Nginx

После внесения изменений в файл конфигурации для домена необходимо перезапустить nginx. Для перезапуска выполните следующую команду: service nginx restart

Проверить корректность конфигурационного файла можно с помощью команды: nginx -t

Профессиональный VPS-хостинг

Откройте для себя возможности виртуального выделенного сервера на SSD.

Подробнее Помогла ли вам статья?

2 раза уже
помогла

Redirect 301 с веб-ресурса «www» на сайт без учета «www» и обратно

Очень часто появляется необходимость в использовании редиректов. К наиболее распространенным ситуациям, в которых задействуется 301 Redirect можно отнести:  

  • случаи, когда страница сменила адрес, а пользователи осуществляют запрос на старую;
  • исключение дублей страниц;
  • переезд с одного сайта на другой со сменой доменного имени. 

Самым верным решением в подобных ситуациях будет реализация редиректа во фронтэнде, посредством NGINX. В идеале рекомендуется отказаться от Appache и использования .htaccess в принципе, если есть желание существенно ускорить работу сайта в целом.

Однако в таком случае, при переходе на NGINX, мы сразу же сталкиваемся с проблемой реализации ранее создававшихся .htaccess редиректов. Рассмотрим несколько эффективных способов организации редиректов в NGINX.

Redirect 301 с веб-ресурса «www» на сайт без учета «www» и обратно

Проверенный способ в данном случае — реализация редиректа на уровне server-директивы.

sеrver {

listеn 80;

sеrver_nаmе sitе.com;

rеwrite ^ http://www.site.com$requеst_uri? pеrmanent;

}

sеrver {

listen 80;

sеrver_nаme www.sitе.com;

. . .

Редирект со включенным режимом ЧПУ

Это очень популярный способ, поскольку, смена адресов страниц происходит и в работающих проектах, а это чревато потерей определенного количества посетителей сайта. В поисковых системах все еще красуется старое приветствие, на веб-сайте – новое, что вводит пользователя в замешательство.

Этот способ перенаправления можно отнести к разряду непростых, поскольку здесь условие содержится в переменных запроса GET. Не совсем понятно, каким образом создавать Location по такому запросу

/dir/?ELЕMENT_ID=777 на /dir/777/.

Есть достаточно эффективный, хотя и не самый удобный, вариант, поскольку присутствие условия «if» в конфигурации NGINX считается не самым удачным решением априори. Но, тем не менее, он работает и работает вполне стабильно:

lоcation ~ /dir/ {

if ( $аrgs ~* (.*)ELEMENT_ID=(.*) )

{

sеt $element_id $2;

set $args »;

rеwrite ^(.*)$ /dir/$ELЕMENT_ID/ pеrmanent;

}

prоxy_pаss $prоxyserver;

}

Перенаправление несуществующих файлов в index.php

Этот индекс в последствии можно использовать при работе со многими популярными CMS, такими как Joomla!, например.

lоcation / {

try_files $uri $uri/ /indеx.php$is_args$аrgs;

}

lоcation ~ \.php$ {

fаstcgi_index index.php;

includе fastcgi_params;

. .

Редиректим пользователей с одной конкретной страницы на другую

lоcation = /pricе.html { rewrite ^(.*)$ /pricе.php; }

Второй более простой способ

rewrite ^/cat/page/$ http://www.example.net/page2/ permanent;

Перенаправление 301 с передачей переменной /оbl/777/ на /оbl.php?obl_idx=777 по условию

lоcation /obl/ { rеwrite /оbl\/(.*)$ /оbl.php?obl_idx=$1; }

Как сделать редирект на Nginx без смены url в браузере? — Хабр Q&A

Добрый день.

Возникла необходимость сделать следующее: есть два сайта site.ru, service.ru, оба на одном сервере). нужно сделать редирект (без изменения url в браузере) такого вида:
site.ru/param1/value1/param2/value2… -> service.ru/site?url=param1/value1/param2/value2&site_id=1

На apache это решается довольно просто (.htaccess для site.ru):

RewriteRule  ^(.*)$ http://service.ru/site?url=$1&site_id=1 [P]

# И для статики
RewriteRule ^img/(.*\.(eot|font.css|otf|ttc|ttf|woff|js|png|jpg|jpeg|gif))$ http://service.ru/static/1/img/$1 [P]

Но проблема в том, что service.ru и остальные сайты крутятся на nginx, настроенным на 80 порт.
Директива rewrite, как я понял, работает только с изменением url. С проксированием толком не смог разобраться.

Развернуть apache как фронтенд для nginx’a (как бы страшно это не звучало), как я понимаю возможно только на 8080, или какой-нибудь другой, не 80 порт. Поскольку на 80 уже nginx и убрать его оттуда нет возможности… только если переводить на apache все остальные сайты, чего бы хотелось избежать…

UPD Убив пол дня, получилось только довольно костыльное решение:

site.ru:80 (Nginx)

server {
    listen 80;
    server_name site.ru  www.site.ru;

    access_log /var/log/nginx/test1.access.log;
    error_log /var/log/nginx/test1.error.log;

    location / {
       proxy_pass http://site.ru:8080;
    }
 }

site.ru:8080 (Apache)

AddDefaultCharset utf-8
Options +FollowSymLinks
RewriteEngine On

RewriteRule  ^(.*)$ http://service.ru/site?url=$1&site_id=1 [P]

# И для статики
RewriteRule ^img/(.*\.(eot|font.css|otf|ttc|ttf|woff|js|png|jpg|jpeg|gif))$ http://service.ru/static/1/img/$1 [P]

То есть следующая цепочка: site.ru (nginx) -> site.ru:8080 (apache) -> service.ru (nginx).
Вроде работает, но боюсь представить, как это скажется на производительности 🙂

Как отключить редирект nginx с http на https? — Хабр Q&A

Вот конфиги /etc/nginx/nginx.conf:
http {
    log_format ispmgrnode '$server_name $request_length $bytes_sent';
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    client_max_body_size 100M;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/vhosts/*/*;
	server {
		server_name localhost;
	disable_symlinks if_not_owner;
	include /etc/nginx/vhosts-includes/*.conf;
	client_max_body_size 100M;
	location @fallback {
		error_log /dev/null crit;
		proxy_pass http://127.0.0.1:8080;
		proxy_redirect http://127.0.0.1:8080 /;
		proxy_set_header Host $host;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
	}
	listen 80;
	listen *.*.*.*:80 default_server;
	}
	server {
		server_name localhost;
	disable_symlinks if_not_owner;
	include /etc/nginx/vhosts-includes/*.conf;
	location @fallback {
		error_log /dev/null crit;
		proxy_pass http://127.0.0.1:8080;
		proxy_redirect http://127.0.0.1:8080 /;
		proxy_set_header Host $host;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
	}
	add_header Strict-Transport-Security "max-age=31536000;";
	listen *.*.*.*:443 default_server;
	ssl on;
	ssl_certificate "/usr/local/mgr5/etc/nginx_certs/default_srv.crtca";
	ssl_certificate_key "/usr/local/mgr5/etc/nginx_certs/default_srv.key";
	ssl_ciphers HIGH:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!EXP:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2;
	ssl_prefer_server_ciphers on;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	}
}

Что нужно изменить/добавить чтобы сайт открывался и в http и в https?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *