Я запускаю Ghost на nginx 1.14.0 и Ubuntu 18.04. Я пытаюсь заблокировать хотлинкинг изображений с внешних сайтов.
Я добавил рекомендуемый код из этого сообщения (начинается с местоположения ~ *. (Gif | png | jpe? G) $), чтобы предотвратить изображение hotlinking.
Вот файл конфигурации моего сайта:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
root /var/www/example.com/system/nginx-root; # Used for acme.sh SSL verification (https://acme.sh)
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/nginx/snippets/ssl-params.conf;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:2368;
}
location ~* \.(gif|png|jpe?g)$ {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
}
location ~ /.well-known {
allow all;
}
client_max_body_size 50m;}
Проблема в том, что когда я добавляю этот блок кода и перезапускаю nginx, он работает правильно и блокирует внешние запросы, возвращающие ошибку 403 Forbidden. Однако он также нарушает локальное отображение изображений, несмотря на то, что реферер, по-видимому, исходит из домена https://example.com , когда я использую сетевой инспектор в Firefox для проверки запроса.
Я пробовал добавление различных серверов в строку valid_referers: localhost, 127.0.0.1, ip сервера, https://example.com/* , http://example.com/* . Тем не менее, независимо от того, как я настраиваю строку valid_referers, изображения все равно блокируются при попытке загрузить их с локального сайта.
Когда я удаляю весь блок блокировки хотлинков, все работает нормально локально, и изображения можно связывать горячими.
1288] Есть идеи? Это сводило меня с ума. Заранее спасибо.
Добавив местоположение ~* \.(gif|png |jpe?g)$
, эти URI не обрабатываются блоком location /
.
См. , как Nginx обрабатывает запрос.
Вам нужно будет сделать операторы proxy_xxx
доступными для нового блока.
Операторы proxy_set_header
могут наследоваться.
Например:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
location / {
proxy_pass http://127.0.0.1:2368;
}
location ~* \.(gif|png|jpe?g)$ {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
proxy_pass http://127.0.0.1:2368;
}