Задать вопрос

Как настроить сложные редиректы NGINX?

Конфиг

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



Условия:
Нужно чтобы все файлы отсюда /var/www/html/domain.com/file/f/
Все изображения отсюда /var/www/html/domain.com/img/i/ и отсюда /var/www/html/domain.com/img/i/fd/редиректились в корень домена. В этих каталогах всегда только изображения. Так же они должны быть доступны и по прямым ссылкам от корня домена.
Так же из этих каталогов они должны быть доступны по прямым ссылка от корня. Например https://domain.com/Diya.png, которое находится в/var/www/html/domain.com/img/i/fd/
Ещё в /var/www/html/domain.com/img/i/ есть файлы миниатюр, которые всегда начинаются с thumb_[рандомные 16 знаков.[расширение]. На них есть редиректы для заглушек, если файлы не существуют.

Сейчас файлы /var/www/html/domain.com/file/f/ и изображения с миниатюрами отсюда /var/www/html/domain.com/img/i/ редиректятся правильно, а отсюда /var/www/html/domain.com/img/i/fd по запросу пример: https://domain.com/img/i/fd/Gemini.png выдают страницу ошибки 404, отсюда https://domain.com/Gemini.png заглушку 404 (404_fallback.png).
  • Вопрос задан
  • 64 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
ky0
@ky0 Куратор тега Nginx
Миллиардер, филантроп, патологический лгун
Тот факт, что Фриланс закрыли - не повод вываливать задания сюда. Курим документацию, методом тыка постепенно осваиваем.
Ответ написан
Ваш ответ на вопрос

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

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