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;
}
}