He buscado pero no encontré ningún tema sobre esto.
Quiero desactivar las descargas desde enlaces externos; es decir, no voy a limitar el privilegio de descarga a usuarios registrados. Me parece bien que cualquiera pueda descargar los recursos de mi sitio Discourse, pero me gustaría que, como mínimo, visiten el sitio y vean el tema.
Actualmente, si hay algún archivo subido en Discourse, alguien puede simplemente publicar el enlace al archivo en otro lugar y las personas pueden descargarlo sin siquiera saber que proviene de mi sitio. ¿Existe alguna forma de lograr esto?
No, este es un escenario diferente: restringe la descarga a cualquier usuario que no haya iniciado sesión. Lo que busco es evitar que se descargue un recurso local desde un enlace en otro sitio web. Para quienes visitan mi sitio, pueden descargarlo, estén registrados o no.
Solo puedes proteger los medios o no. Si no están protegidos, seguro que cualquiera puede usar el enlace sin mostrar tu interfaz de usuario. El navegador no le importa qué páginas ha visitado antes.
Si los recursos son valiosos, ¿por qué no protegerlos y distribuir el enlace en el tema al que están vinculados? Esto proporcionará un incentivo adicional para registrarse en tu sitio.
El navegador no, pero el servidor sí. Por defecto, cuando un navegador realiza una solicitud al mismo origen que la página que contiene la referencia, incluirá una cabecera de referidor para indicar al servidor de dónde proviene. Un servidor puede utilizar esta información para influir en su comportamiento, incluyendo permitir o denegar el acceso a ciertas ubicaciones.
Es fácil eludirlo, pero evita la vinculación casual desde otros sitios web.
Sustituir www.example.com en el código anterior por el dominio de tu instancia de Discourse debería ser una configuración de nginx adecuada para evitar la vinculación directa (hotlinking) a las subidas en tu instancia.
También podrías querer hacer algo diferente a devolver un 403 (no permitido); por ejemplo, podrías querer redirigir a la página de inicio de tu Discourse. Para ello, podrías utilizar el siguiente código en su lugar.
Debería ser posible añadir algo a tu archivo app.yml para inyectar la configuración durante una reconstrucción. Sin embargo, no estoy seguro de cómo hacerlo, ya que no lo he investigado en gran detalle.
Gracias por compartirlo, Simon. Esto podría ser la solución para mis necesidades, aunque aún no sé cómo aplicarlo con Discourse. Sé un poco sobre servidores Linux y Apache, pero Discourse utiliza Docker y Nginx, ambos fuera de mi alcance de conocimiento. De todos modos, Simon nos ha indicado una dirección y lo investigaré para ver si puedo hacer algo.
Resulta que la configuración que Discourse utiliza para nginx ya incluye algo para hotlinking, aunque está comentado. Por lo tanto, lo que puedes hacer es agregar un par de reemplazos a tu archivo app.yml para descomentar esas líneas.
Edita /var/discourse/containers/app.yml con tu editor preferido. Al final encontrarás una sección run y, al final de esta, un exec que dice echo “end of custom commands”.
En la primera sección de reemplazo verás la línea “to:” con mysite.com *.mysite.com; sustitúyelas por tu propio nombre de dominio, por ejemplo discourse.org *.discourse.org. El segundo reemplazo asume que deseas que los visitantes sean redirigidos a la página de inicio de Discourse.
Después de guardar los cambios, ejecuta los siguientes comandos para reconstruir Discourse con la configuración actualizada de nginx.