AsviS
@AsviS
начинающий

Как правильно настроить конфиг Nginx?

Добрый День!
Подскажите как мне правильно настроить конфиг сервера на Nginx, нужно чтобы сайт работал на https НО чтобы все что в папке downloads скачивалось по http (обязательно по http, можно и https), но так чтобы весь сайт работал по https (редиректом с http на https кроме файлов в папке downloads), а также чтобы работали поддомены например docs.example.com и telemirta.example.com, настраиваю конфиг так:

server {
    server_name          www.example.com;
    listen               *:80;
    listen               [::]:80 ipv6only=on;

    if ($uri !~* ^/downloads/(.+)$) {
        return 301 https://example.com/downloads/$1;
    }

}

server {
	listen *:80 default_server;
	listen [::]:80 default_server;


    server_name example.com *.example.com;
    root /var/www/html/$subdomain;
    set $subdomain "";
    if ($host ~* ^([a-z0-9-\.]+)\.example.com$) {
        set $subdomain $1;
        return 301 https://$1.example.com$request_uri;
    }
    if ($host ~* ^example.com$) {
        set $subdomain "";
        return 301 https://example.com$request_uri;
    }

	index index.html index.htm index.nginx-debian.html index.php;

    if ($uri !~* ^/downloads/(.+)$) {
        return 301 https://example.com/downloads/$1;
    }

	location / {
		try_files $uri $uri/ =404;
	}

	location /munin/ {
	        alias /var/cache/munin/www/;
	}


}

server {
	listen *:443 ssl;
	listen [::]:443;

    server_name example.com *.example.com;
    root /var/www/html/$subdomain;
    set $subdomain "";
    if ($host ~* ^([a-z0-9-\.]+)\.example.com$) {
        set $subdomain $1;
    }
    if ($host ~* ^example.com$) {
        set $subdomain "";
    }

index index.php index.html index.htm;
ssl_certificate /etc/ssl/example_com_crt.crt;
ssl_certificate_key /etc/ssl/example_com.key;

	location / {
		try_files $uri $uri/ =404;
	}
#rewrite ^/(downloads) http://$server_name$request_uri permanent;
rewrite ^/downloads/(.+)$ http://example.com/downloads/$1 permanent;

	location /munin/ {
	        alias /var/cache/munin/www/;
	}

location ~* \.php$ { try_files $uri = 404; include fastcgi_params;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/run/php/php7.0-fpm.sock;
 }

}


сам сайт работает по https все ок, php работает, поддомены работают, но вот когда перехожу на example.com/downloads/testarch.zip или example.com/downloads/testfi.amx то получаю ответ от браузера
Страница недоступна
Сайт example.com выполнил переадресацию слишком много раз.
ERR_TOO_MANY_REDIRECTS

а если пробую перейти на example.com/downloads то редиректит на https://example.com (на главную)
Помогите разобраться пожалуйста!
  • Вопрос задан
  • 213 просмотров
Пригласить эксперта
Ответы на вопрос 2
@dodo512
server {
    server_name          www.example.com;
    listen               *:80;
    listen               [::]:80 ipv6only=on;

    if ($uri !~* ^/downloads/(.+)$) {
        return 301 https://example.com/downloads/$1;
    }

}

Тут вместо if лучше использовать location.
server {
    server_name  example.com  www.example.com;
    listen               *:80;
    listen               [::]:80 ipv6only=on;

    location / {
         return 301 https://example.com$request_uri;
    }
    
    location /downloads/ {
        root /var/www/html;
    }
}
Ответ написан
Adamos
@Adamos
/*HTTP*/
    if ($uri !~* ^/downloads/(.+)$) {
        return 301 https://example.com/downloads/$1;
    }

/*HTTPS*/
    rewrite ^/downloads/(.+)$ http://example.com/downloads/$1 permanent;

Вы уж определитесь, куда хотели послать пользователя...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы