Print this page

NGINX Redirect Examples

12 September 2024

NGINX Redirects: Быстро и По-DevOps

Лови концентрат по редиректам в NGINX. Всё по-честному, без воды и лишних рассуждений.


1. Где правим

Редиректы прописываем в конфиге виртуальных хостов:

  • RPM-системы (CentOS, RHEL): /etc/nginx/conf.d/
  • Deb-системы (Ubuntu, Debian): /etc/nginx/sites-enabled/
  • FreeBSD: /usr/local/etc/nginx/nginx.conf

Есть два основных способа редиректа:

2. Rewrite

rewrite ^ https://$host$request_uri? <флаг>;

Флаги:

  • permanent – 301
  • redirect – 302
  • last – закончить обработку с переходом в новый location
  • break – закончить обработку, остаться в текущем location

3. Return

return <код> https://$host$request_uri;

Чаще всего: 301, 302, 404

После изменений:

nginx -t
systemctl restart nginx

4. HTTP → HTTPS

server {
    listen 80;
    server_name devopz.tech www.devopz.tech;
    return 301 https://$host$request_uri;
}

Или с условием для исключений:

server {
    listen 80;
    server_name devopz.tech www.devopz.tech;
    if ($uri !~ /page.html){
        return 301 https://$host$request_uri;
    }
}

5. Один server на http и https

server {
    listen 80;
    listen 443 ssl;
    server_name devopz.tech www.devopz.tech;

    if ($scheme = 'http') {
        return 301 https://$host$request_uri;
    }

    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/cert.key;

    ...
}

6. С одного домена на другой

server {
    server_name domain1.ru;
    return 302 http://domain2.ru$request_uri;
}

7. Без www → с www

server {
    server_name devopz.tech;
    return 301 http://www.$host$request_uri;
}

8. С www → без www

server {
    server_name www.devopz.tech;
    return 301 $scheme://devopz.tech$request_uri;
}

Или для всех доменов через regex:

server {
    server_name "~^www\.(.*)$";
    return 301 $scheme://$1$request_uri;
}

9. /index.php → /

server {
    if ($request_uri ~ "^(.*)index\.(?:php|html)") {
        return 301 $1;
    }
}

10. По умолчанию для неизвестных доменов

server {
    listen 80 default_server;
    return 302 https://welcome.devopz.tech$request_uri;
}

server {
    listen 443 ssl default_server;
    return 302 $scheme://welcome.devopz.tech$request_uri;
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/cert.key;
}

11. IP → домен

server {
    listen 80;
    server_name 192.168.1.15;
    return 301 http://devopz.tech$request_uri;
}

Вот так, быстро и чисто, все типовые редиректы в одном месте. Проверено и работает.