В чем заключается ошибка в запрете прямого обращения к файлу?

Добрый день! <br/> Я пытаюсь запретить прямой доступ к файлам в папке "data". Для этого использую следующий код: <br/> <pre><code class="nginx">location ~* $root_path/app/\d+/data/ {
		valid_referers none blocked site;
		if ($invalid_referer) {
			return 403;
		}
	}</code></pre> <br/> Также пробовал другой вариант: <br/> <pre><code class="nginx">location /data/ {
		valid_referers none blocked site;
		if ($invalid_referer) {
			return 403;
		}
	}</code></pre> <br/> Однако ни один из вариантов не работает. Можете подсказать, в чем может быть ошибка? Мне нужен первый вариант, так как есть и другие папки с похожими названиями, которые не следует затрагивать. <br/> Спасибо!
  • 7 января 2025 г. 6:53
Ответы на вопрос 2
Добрый день!

Ваша проблема заключается в неправильной настройке директивы `location` и, возможно, в том, как вы используете переменные Nginx, такие как `$root_path`.

1. **Шаблон Location**: В первом варианте у вас используется регулярное выражение, но оно не соответствует синтаксису Nginx. Вы можете использовать выражение вида `location ~* ^$root_path/app/\d+/data/`, однако `$root_path` не будет распознано, так как это не является стандартной переменной. Вместо этого нужно использовать относительный путь от корня сервера.

2. **Проблема с регулярными выражениями**: Чтобы сделать поиск по пути корректным, проверьте, что путь после `location` полностью соответствует требованиям вашего сервера.

С учетом этих замечаний, вот наиболее корректный вариант запрета доступа к папке `data`:

```nginx
location ~* ^/app/\d+/data/ {
    valid_referers none blocked yourdomain.com;
    if ($invalid_referer) {
        return 403;
    }
}
```

Здесь:
- Замените `yourdomain.com` на ваш реальный домен.
- Регулярное выражение должно начинаться с `^`, чтобы указать, что путь должен соответствовать начинанию строки.
- Переменная `$invalid_referer` будет работать, как вы ожидаете, в контексте блока `location`.

3. **Проверка конфигурации**: Убедитесь, что указанные вами пути действительно соответствуют структуре ваших файлов на сервере. Также после внесения изменений выполните проверку конфигурации:

```bash
nginx -t
```

4. **Перезапуск Nginx**: Не забудьте перезапустить Nginx после изменении конфигурации, чтобы новые настройки вступили в силу:

```bash
systemctl restart nginx
```

Если после указанных изменений проблема остается, проверьте логи Nginx на предмет ошибок, они могут дать подсказку о том, что не так.
Куча лишнего. Не нужен тут ни root_path, ни "none blocked". Хотите, чтобы запросы проходили только с определённых сайтов, оставьте в valid_referers только нужные домены. Если это те же домены, про которые конфиг - есть специальный аргумент server_names .
Похожие вопросы