Я хочу отключить загрузку по внешним ссылкам. То есть я не собираюсь ограничивать права на загрузку только для зарегистрированных пользователей; мне подходит, если любой желающий сможет скачивать ресурсы с моего сайта Discourse, но я бы хотел, чтобы они хотя бы заходили на сайт и просматривали тему.
В настоящее время, если на Discourse загружен какой-либо файл, кто-то может просто разместить ссылку на этот файл где-либо, и люди смогут его скачать, даже не зная, что он поступает с моего сайта. Есть ли способ этого добиться?
Нет, это другой сценарий: ограничение на скачивание для всех неавторизованных пользователей. То, что я пытаюсь реализовать, — это предотвращение скачивания по ссылке на локальный ресурс с других сайтов. Посетители моего сайта могут скачивать файлы независимо от того, зарегистрированы они или нет.
Медиа-ресурсы могут быть либо защищены, либо нет. Если они не защищены, то любой, безусловно, сможет использовать ссылку, не открывая ваш интерфейс? Браузер не будет учитывать, какие страницы вы посещали ранее.
Если ресурсы ценны, почему бы не защитить их и не распространять ссылку в рамках темы, к которой они привязаны? Это создаст дополнительный стимул для регистрации на вашем сайте.
Браузеру — нет, серверу — да. По умолчанию, когда браузер отправляет запрос к тому же источнику, что и страница, содержащая ссылку, он включает заголовок referrer, чтобы сообщить серверу, откуда он пришел. Сервер может использовать эту информацию для управления поведением, включая разрешение или запрет доступа к определенным ресурсам.
Обойти это легко, но такой механизм предотвращает случайные ссылки с других сайтов.
Замена www.example.com в приведенном выше коде на домен вашего экземпляра Discourse должна стать подходящей конфигурацией nginx для предотвращения хотлинкинга к загрузкам на вашем экземпляре.
Возможно, вы захотите сделать что-то иное, чем возврат 403 (запрещено). Например, вы можете перенаправлять пользователей на главную страницу вашего экземпляра Discourse. Для этого можно использовать следующий код:
Должна существовать возможность добавить что-то в ваш файл app.yml для внедрения этой конфигурации при пересборке. Однако я не уверен, как это сделать, так как не изучал этот вопрос подробно.
Отлично! У меня действительно был абзац о перенаправлении, но я отредактировал свой предыдущий пост, чтобы сделать его более понятным, используя полный пример.
Спасибо за информацию, Саймон. Это может быть решением для моих задач, хотя я пока не знаю, как применить это в Discourse. Я немного разбираюсь в Linux-серверах и Apache, но Discourse использует Docker и Nginx, что выходит за рамки моих знаний. В любом случае Саймон указал направление, и я изучу его, чтобы понять, смогу ли я что-то сделать.
Оказывается, конфигурация Discourse для nginx уже включает настройки для защиты от хотлинкинга, хотя они и закомментированы. Поэтому вы можете добавить несколько замен в файл app.yml, чтобы раскомментировать эти строки.
Откройте файл /var/discourse/containers/app.yml в предпочитаемом редакторе. В конце файла вы найдете секцию run, а в её конце — команду exec с выводом “end of custom commands”.
Перед этой командой exec добавьте следующие строки:
В первой секции replace в строке “to:” замените mysite.com *.mysite.com на ваш домен, например discourse.org *.discourse.org. Вторая замена предполагает, что вы хотите перенаправлять посетителей на главную страницу Discourse.
После сохранения изменений выполните следующие команды для пересборки Discourse с обновленной конфигурацией nginx: