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;
}
Вот так, быстро и чисто, все типовые редиректы в одном месте. Проверено и работает.
