## HTTP redirect
server {
listen 80;
server_name domain.com;
## logging
access_log /var/log/nginx/access_http.log cloudflare buffer=512k flush=1m;
error_log /var/log/nginx/error_http.log warn;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
server_name domain.com;
root /var/www/html/domain.com;
index index.html;
client_max_body_size 1024M;
client_body_temp_path /var/tmp/nginx-client-body 1;
# include nginxconfig.io/letsencrypt.conf;
more_set_headers "Server: Apache/2.4.10 (Arch)";
set $nginxerrors /usr/share/nginx/html;
include /etc/nginx/errordocs_default.inc;
autoindex off;
## SSL
ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/domain.com/chain.pem;
ssl_protocols TLSv1.2 TLSv1.3;
## openssl dhparam -out /etc/nginx/dhparam.pem 2048
ssl_dhparam /etc/nginx/dhparam.pem;
## security headers
add_header X-Frame-Options "DENY" always;
add_header X-Robots-Tag "noindex, nofollow" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Cross-Origin-Embedder-Policy "require-corp" always;
add_header Cross-Origin-Opener-Policy "same-origin" always;
add_header Cross-Origin-Resource-Policy cross-origin always;
# add_header Cross-Origin-Resource-Policy "same-origin" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=(), usb=(), fullscreen=(self)" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header Content-Security-Policy "default-src 'self'; img-src 'self' data:; script-src 'self'; style-src 'self'; object-src 'none'; frame-ancestors 'none'; base-uri 'self'; form-action 'self';" always;
# . files
# location ~ /\.(?!well-known) {
# deny all;
# }
# logging
access_log /var/log/nginx/access_https.log cloudflare buffer=512k flush=1m;
error_log /var/log/nginx/error_https.log warn;
## Reverse proxy с try_files
location / {
try_files $uri $uri/ =404;
add_header X-Frame-Options "DENY" always;
add_header X-Robots-Tag "noindex, nofollow" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Cross-Origin-Embedder-Policy "require-corp" always;
add_header Cross-Origin-Opener-Policy "same-origin" always;
add_header Cross-Origin-Resource-Policy cross-origin always;
# add_header Cross-Origin-Resource-Policy "same-origin" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=(), usb=(), fullscreen=(self)" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header Content-Security-Policy "default-src 'self'; img-src 'self' data:; script-src 'self'; style-src 'self'; object-src 'none'; frame-ancestors 'none'; base-uri 'self'; form-action 'self';" always;
fastcgi_param REQUEST_URI $request_uri;
proxy_set_header Host $host;
add_header Cache-Control "max-age=0, no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
## Proxy SSL
proxy_ssl_server_name on;
## Proxy headers
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Forwarded $proxy_add_forwarded;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
## Proxy timeouts
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
## include nginxconfig.io/proxy.conf;
}
## Обработка 404 для миниатюр (если файла нет, отдаём заглушку)
location ~ ^/thumb_ {
root /var/www/html/domain.com/img/i/;
try_files $uri /res/imgs/errors/404_thumb.png;
}
## Обработка 404 для изображений (если файла нет, отдаём заглушку)
location ~ ^/[^/]+\.(jpg|jpeg|jpe|jif|jfif|png|bmp|gif|tiff|tif|webp|heic|heif|avif|svg|ico)$ {
root /var/www/html/domain.com/img/i;
try_files $uri /res/imgs/errors/404_fallback.png;
}
## Путь к заглушкам 404
location = /res/imgs/errors/404_fallback.png {
root /var/www/html/domain.com;
}
location = /res/imgs/errors/404_thumb.png {
root /var/www/html/domain.com;
}
location = /res/imgs/favicon.ico {
root /var/www/html/domain.com;
log_not_found off;
access_log off;
return 204;
}
location ~ ^/(?!index\.html)[^/]+$ {
root /var/www/html/domain.com/file/f;
}
## Файлы, не относящиеся к изображениям (редирект из /file/f/)
location ~ ^/file/f(/[^/]+)$ {
return 301 $1;
}
## Основные файлы изображений (редирект, если путь не содержит img/i/)
location ~ ^/img/i(/[^/]+\.(jpg|jpeg|jpe|jif|jfif|png|bmp|gif|tiff|tif|webp|heic|heif|avif|svg|ico))$ {
return 301 https://$host$1;
}
## Обработка PHP
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PHP_ADMIN_VALUE "error_log=/var/log/php/errors-domain.com.log";
## fastcgi_param HTTP_AUTHORIZATION $http_authorization;
include fastcgi_params;
}
location ^~ /res/imgs/ {
root /var/www/html/domain.com;
log_not_found off;
}
location ^~ /res/css/ {
root /var/www/html/domain.com;
log_not_found off;
}
location ~* \.(jpg|jpeg|jpe|jif|jfif|png|bmp|gif|tiff|tif|webp|heic|heif|avif|svg|ico)$ {
root /var/www/html/domain.com/img/i;
try_files $uri =404;
add_header Access-Control-Allow-Origin "*" always;
add_header Access-Control-Allow-Methods "GET, OPTIONS" always;
add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range" always;
add_header Access-Control-Expose-Headers "Content-Length,Content-Range" always;
## Разрешить загрузку изображений с других сайтов
add_header Cross-Origin-Resource-Policy "cross-origin" always;
}
location = /res/imgs/php_out_error.png {
log_not_found off;
}
location = /res/imgs/errors/favicon_error.png {
log_not_found off;
}
location = /robots.txt {
log_not_found off;
}
# include nginxconfig.io/general.conf;
}