Перейти к содержанию

nginx

Отдельный root для папки

Необходимо вынести каталог _debug из директории сайта, но чтоб /_debug/ был доступен через url.

server {
    root /var/site/www;

    location / {
        location ~ \.php$ {
            include        /etc/nginx/fastcgi_params;
            fastcgi_pass   unix:/var/run/php/php8.3-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }

    location /_debug {
        alias /var/site/_debug;
        location ~ \.php$ {
            include        /etc/nginx/fastcgi_params;
            fastcgi_pass   unix:/var/run/php/php8.3-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $request_filename;
            fastcgi_param  DOCUMENT_ROOT    /var/site/www;
        }
    }
}

Заглушка для сайта

server {
    listen 80;
    server_name my-site.loc;

    ...

    location =/adminer.php {
        # можно включить какую-нибудь админку
    }
    location / {
        return 503;
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /var/www/errors;
    }

    ...

}

Создать файл /var/www/errors/50x.html

Раздача защищённого контента

Используя заголовок X-Accell-Redirect можно организовать раздачу файлов с предварительной проверкой прав.

  • Создаётся location с параметром internal. Именно этот location будет отдавать файлы. Доступ из браузера на него запрещен
  • Создаётся location, который будет обрабатывать запрос и редиректить на предыдущий location

Пример

Запрос https://site.loc/images/cat.jpg будет обработан файлом index.php. Этот файл из url получит запрашиваемый файл, проверит наличие, сформирует необходимый редирект на internal location.

Изображения физически лежат в /site/store/secure-images

server {
    root /site/www;

    location /images {
        try_files  $uri  $uri/  /images/index.php?$query_string;
        location ~ \.php$ {
            include        /etc/nginx/fastcgi_params;
            fastcgi_pass   unix:/var/run/php/php8.3-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }

    location /secure-images {
        internal;
        root /site/storage;
    }
}

Файл /site/images/index.php:

<?php
$file = 'Определение запрашиваемого файла';
// проверка наличия файла
header('X-Accel-Redirect: ' . '/secure-images/' . $file);
header('Content-Type: image/jpeg');
// этот заголовок указывает показывать файл вместо выдачи диалога скачивания
header('Content-Disposition: inline');
exit;

bitrix, https и reverse proxy

Введём переменную $http_forwarded_proto, которая будет вести себя аналогично $https, но учитывая X-Forwarded-Proto.

конфиг для reverse proxy
server {
    location / {
        proxy_pass        http://ip;
        proxy_set_header  Host              $host;
        proxy_set_header  X-Forwarded-Proto $scheme;
        proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header  X-Real-IP         $reemote_addr;
    }
}
конфиг для приложения
http {
    # создание переменной
    map  $http_forwarded_proto  $fastcgi_https {
        default  '';
        https    on;
    }
}

server {
    location ~ \.php$ {
        include         fastcgi_params;
        fastcgi_pass    unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_index   index.php;
        fastcgi_param   HTTPS            $fastcgi_https;
        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    }
}