Назад | Перейти на главную страницу

Защита от хотлинкинга в nginx заставила исчезнуть образы моих доменов

После добавления кода защиты от хотлинкинга в серверный блок ни одно из изображений не загружается. Вот полный сервер блочный код рассматриваемого веб-сервера:

server {
    listen 443 ssl;

    server_name mydomain.com www.mydomain.com 192.168.1.101;

    if ($host !~* ^www\.(.*)$) {
        return 301 https://www.$host$request_uri;
    }

    ssl_certificate             "G:/Web Sites/MyDomain/certificate/certificate.crt";
    ssl_certificate_key         "G:/Web Sites/MyDomain/certificate/private.key";
    ssl_session_cache           shared:SSL:1m;
    ssl_session_timeout         5m;
    ssl_ciphers                 HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    charset utf-8;

    access_log logs/MyDomain.log main;

    root   "G:/Web Sites/MyDomain";
    index  index.php index.php3 index.php4 index.php5 index.html index.htm;

    location / {
        location = /favicon.ico {
            log_not_found off;
            access_log off;
        }

        if ($request_uri ~* ".(ico|css|js|gif|jpe?g|png)$") {
            expires 30d;
            access_log off;
            add_header Pragma public;
            add_header Cache-Control "public";
            break;
        }
    }

    error_page 404 /; #404.html;
    error_page 500 502 503 504 /50x.html;

    location = /50x.html {
        root html;
    }

    location ~ \.php$ {
        root            "G:/Web Sites/MyDomain";
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }

    #Hotlinking protection.
    #location ~* \.(gif|jpe?g|png|wmv|avi|mpg|mpeg|mp4|htm|html|js|css)$ {
    #   valid_referers none blocked mydomain.com *.mydomain.com ~\.google\. ~\.yahoo\. ~\.bing\. ~\.facebook\. ~\.fbcdn\. ~\.twitter\. ~\.pinterest\. ~\.ask\. ~\.wp\.;

    #   if ($invalid_referer) {
    #       return 301 https://sites.google.com/site/tcperpetual/home/hotlinked-message.gif;
    #   }
    #}
}

Не слишком уверен, что не так, и есть ли у моих изображений другой референт, но все они находятся на моем веб-сервере. Мои изображения динамически загружаются в div.

В вашем вопросе есть проблемы с форматированием, но вот что я могу сказать. Пожалуйста, также определите «не работает». Вы можете открыть веб-консоль браузера (с помощью F12) и увидеть код ошибки на вкладке сети.

Nginx выберет только один блок местоположения из многих, которые у вас есть. Когда ваш браузер запрашивает файл изображения, Nginx выберет отображаемый вами блок местоположения. Если ваш реферер действителен (в зависимости от директивы valid_referers), ваш блок не будет делать ничего особенного, иначе он вернет ошибку 403.

Если вы получили 403, проверьте синтаксис valid_referers (он выглядит правильно). Если вы получили 404, это, вероятно, означает, что у вас есть блок местоположения для / в котором есть все директивы, необходимые Nginx для поиска файлов вашего веб-сайта, но он не используется при запросе изображения, возможно, примерно так:

server {
  location / {
    root /var/www;
  }
  location ~* .(gif|...)$ {
    ...
  }
}

Здесь, когда запрашивается изображение, root директива не интерпретируется, поэтому Nginx не знает, где искать файл, поэтому ошибка 404.

Попробуйте поместить содержимое блока / location непосредственно в блок server, чтобы оно действительно интерпретировалось, например:

server {
  root /var/www;
  location ~* .(gif|...)$ {
    ...
  }

Другое решение - скопировать некоторые директивы из / блок местоположения, если вам действительно нужно его сохранить, например:

server {
  location / {
    root /var/www;
  }
  location .(gif|...)$ {
    root /var/www;
    ...
  }