Могу ли я запретить загрузку по внешним ссылкам?

Здравствуйте,

Я искал, но не смог найти тему на эту тему.

Я хочу отключить загрузку по внешним ссылкам. То есть я не собираюсь ограничивать права на загрузку только для зарегистрированных пользователей; мне подходит, если любой желающий сможет скачивать ресурсы с моего сайта Discourse, но я бы хотел, чтобы они хотя бы заходили на сайт и просматривали тему.

В настоящее время, если на Discourse загружен какой-либо файл, кто-то может просто разместить ссылку на этот файл где-либо, и люди смогут его скачать, даже не зная, что он поступает с моего сайта. Есть ли способ этого добиться?

Большое спасибо.
Цзянь

2 лайка

Возможно, это поможет?

3 лайка

Спасибо за ответ.

Нет, это другой сценарий: ограничение на скачивание для всех неавторизованных пользователей. То, что я пытаюсь реализовать, — это предотвращение скачивания по ссылке на локальный ресурс с других сайтов. Посетители моего сайта могут скачивать файлы независимо от того, зарегистрированы они или нет.

1 лайк

Разве это семантически одно и то же?

Медиа-ресурсы могут быть либо защищены, либо нет. Если они не защищены, то любой, безусловно, сможет использовать ссылку, не открывая ваш интерфейс? Браузер не будет учитывать, какие страницы вы посещали ранее.

Если ресурсы ценны, почему бы не защитить их и не распространять ссылку в рамках темы, к которой они привязаны? Это создаст дополнительный стимул для регистрации на вашем сайте.

1 лайк

Браузеру — нет, серверу — да. По умолчанию, когда браузер отправляет запрос к тому же источнику, что и страница, содержащая ссылку, он включает заголовок referrer, чтобы сообщить серверу, откуда он пришел. Сервер может использовать эту информацию для управления поведением, включая разрешение или запрет доступа к определенным ресурсам.

Обойти это легко, но такой механизм предотвращает случайные ссылки с других сайтов.

location /uploads/ {
    valid_referers  www.example.com;
    if ($invalid_referer) {
        return 403;
    }
}

Замена www.example.com в приведенном выше коде на домен вашего экземпляра Discourse должна стать подходящей конфигурацией nginx для предотвращения хотлинкинга к загрузкам на вашем экземпляре.

Возможно, вы захотите сделать что-то иное, чем возврат 403 (запрещено). Например, вы можете перенаправлять пользователей на главную страницу вашего экземпляра Discourse. Для этого можно использовать следующий код:

location /uploads/ {
    valid_referers  www.example.com;
    if ($invalid_referer) {
        return 307 /;
    }
}

Должна существовать возможность добавить что-то в ваш файл app.yml для внедрения этой конфигурации при пересборке. Однако я не уверен, как это сделать, так как не изучал этот вопрос подробно.

4 лайка

И этого, вероятно, достаточно? Точка, Саймон, отлично.

Ещё лучше, если бы вы добавили правило для перенаправления на главную страницу?

3 лайка

Отлично! У меня действительно был абзац о перенаправлении, но я отредактировал свой предыдущий пост, чтобы сделать его более понятным, используя полный пример.

1 лайк

Спасибо за информацию, Саймон. Это может быть решением для моих задач, хотя я пока не знаю, как применить это в Discourse. Я немного разбираюсь в Linux-серверах и Apache, но Discourse использует Docker и Nginx, что выходит за рамки моих знаний. В любом случае Саймон указал направление, и я изучу его, чтобы понять, смогу ли я что-то сделать.

1 лайк

Оказывается, конфигурация Discourse для nginx уже включает настройки для защиты от хотлинкинга, хотя они и закомментированы. Поэтому вы можете добавить несколько замен в файл app.yml, чтобы раскомментировать эти строки.

Откройте файл /var/discourse/containers/app.yml в предпочитаемом редакторе. В конце файла вы найдете секцию run, а в её конце — команду exec с выводом “end of custom commands”.

Перед этой командой exec добавьте следующие строки:

  - replace:
      filename: "/etc/nginx/conf.d/discourse.conf"
      from: "#valid_referers none blocked mysite.com *.mysite.com;"
      to: valid_referers none blocked mysite.com *.mysite.com;

  - replace:
      filename: "/etc/nginx/conf.d/discourse.conf"
      from: "#if ($invalid_referer) { return 403; }"
      to: if ($invalid_referer) { return 307 /; }

В первой секции replace в строке “to:” замените mysite.com *.mysite.com на ваш домен, например discourse.org *.discourse.org. Вторая замена предполагает, что вы хотите перенаправлять посетителей на главную страницу Discourse.

После сохранения изменений выполните следующие команды для пересборки Discourse с обновленной конфигурацией nginx:

cd /var/discourse
./launcher rebuild app
4 лайка