Настройка Ngnix для отдачи mp4/mp3 файлов для доверенных доменных имён, проверка реферера - Ubuntu HestiaCP
На одном из доменов у меня храняться файлы, и я решил их отдавать только доверенным доменам: domen1.ru, domen2.ru и domen3.ru. Сами же файлы храняться на file-domen.ru.
Внимание! Не забываем заменять на свои, следующие значения: user,путь на сервере, разрешенный домен, правильно прописывайте пути. Желательно авторизоваться по SFTP под рутом в програмке WinSCP, а там уже сверять адреса. Так же можно создавать и вносить правки в файлы не через SSH, а с помощью текстового редактора Notepad+. Вот только тестировать Ngnix и перезагружать его предётся через SSH.
Прямая ссылка на файл выглядит так: https://file-domen.ru/start/video/12357.mp4
Итак. Заходим под рутом в SSH, через терминал Windows PowerShell.
Создаём файл: /home/user/conf/web/file-domen.ru/nginx.ssl.conf_custom
nano /home/user/conf/web/file-domen.ru/nginx.ssl.conf_custom
И вставляем туда:
location ^~ /start/ {
root /home/user/web/file-domen.ru/public_html;
location ~* \.mp4$ {
valid_referers none blocked domen1.ru *.domen1.ru domen2.ru *.domen2.ru domen3.ru *.domen3.ru;
if ($invalid_referer) {
return 403;
}
add_header X-Content-Type-Options nosniff;
add_header Cache-Control 'public, max-age=31536000';
types { video/mp4 mp4; }
}
}
Сохраняем нажатием: Ctr+X, Y, Enter. Проверяем, перезагружаем:
nginx -t && systemctl reload nginx
Далее проводим тесты.
Сперва тестируем запрос к файлу от несуществующего домена:
curl -I -e "https://not-domen.ru/test.html" "https://file-domen.ru/start/video/12357.mp4"
В ответ мы должны получить нечто подобное: (403 Доступ запрещён!)
root@ds1111:~# curl -I -e "https://not-domen.ru/test.html" "https://file-domen.ru/start/video/12357.mp4"
HTTP/2 403
server: nginx
date: Sat, 08 Nov 2025 16:19:24 GMT
content-type: text/html; charset=utf-8
content-length: 2898
vary: Accept-Encoding
etag: "62d74628-b32"
А теперь тестируем от доверенного домен:
curl -I -e "https://domen1.ru/test.html" "https://file-domen.ru/start/video/12357.mp4"
В ответ получаем: (200 Доступ разрешен!)
root@ds1111:~# curl -I -e "https://domen1.ru/test.html" "https://file-domen.ru/start/video/12357.mp4"
HTTP/2 200
server: nginx
date: Sat, 08 Nov 2025 16:22:34 GMT
content-type: video/mp4
content-length: 11403968
last-modified: Sat, 25 Jan 2025 07:44:28 GMT
etag: "6714965c-ae03c0"
x-content-type-options: nosniff
cache-control: public, max-age=31536000
accept-ranges: bytes
Внимание! Данный способ разрешает доступ к файлам если реферер не указывать:
curl -I "https://file-domen.ru/start/video/12357.mp4"
Получаем:
root@ds1111:~# curl -I "https://file-domen.ru/start/video/12357.mp4"
HTTP/2 200
server: nginx
date: Sat, 08 Nov 2025 16:59:35 GMT
content-type: video/mp4
content-length: 11403968
last-modified: Sat, 25 Jan 2025 07:44:28 GMT
etag: "6794065c-ae02c0"
x-content-type-options: nosniff
cache-control: public, max-age=31536000
accept-ranges: bytes
Что бы запретить доступ тем у кого нет реферера, правим конфиг: nginx.ssl.conf_custom
nano /home/user/conf/web/file-domen.ru/nginx.ssl.conf_custom
И удаляем none перед blocked domen1.ru *.domen1.ru... ...;
location ^~ /start/ {
root /home/user/web/file-domen.ru/public_html;
location ~* \.mp4$ {
valid_referers blocked domen1.ru *.domen1.ru domen2.ru *.domen2.ru domen3.ru *.domen3.ru;
if ($invalid_referer) {
return 403;
}
add_header X-Content-Type-Options nosniff;
add_header Cache-Control 'public, max-age=31536000';
types { video/mp4 mp4; }
}
}
Сохраняем нажатием: Ctr+X, Y, Enter. Тестируем и перезагружаем Nginx:
nginx -t && systemctl reload nginx
Далее проводим тест:
curl -I "https://file-domen.ru/start/video/12357.mp4"
И в ответ получаем (403 Доступ запрещён!)
root@ds1111:~# curl -I "https://file-domen.ru/start/video/12357.mp4"
HTTP/2 403
server: nginx
date: Sat, 08 Nov 2025 17:12:16 GMT
content-type: text/html; charset=utf-8
content-length: 2898
vary: Accept-Encoding
etag: "68d24628-b52"
Комментариев 0