外部リンクからのダウンロードを禁止できますか?

こんにちは、

この件についてトピックが見つからなかったため、検索しました。

外部リンクからのダウンロードを無効にしたいと考えています。つまり、ダウンロード権限を登録ユーザーに限定するつもりはありません。Discourse サイト上のリソースは誰でもダウンロード可能で構いませんが、少なくともサイトを訪問してトピックを確認してもらいたいのです。

現在、Discourse にファイルがアップロードされている場合、そのファイルへのリンクをどこかに投稿するだけで、サイトがどこから来ているかさえ知らずにダウンロードできてしまいます。これを防ぐ方法はありますか?

よろしくお願いいたします。
Jian

「いいね!」 2

これは役立つかもしれませんか?

「いいね!」 3

返信ありがとうございます。

いいえ、これは別のシナリオです。ログインしていないユーザーのダウンロードを制限するのではなく、他サイトからのローカルリソースへのリンク経由でのダウンロードを防ぎたいのです。私のサイトを訪れる人については、登録の有無にかかわらずダウンロードできるようにしたいと考えています。

「いいね!」 1

それらは意味的に同じことでしょうか?

メディアは、保護するかしないかしかありません。保護されていない場合、確かに誰でも UI を表示させることなくリンクを使用できてしまいます。ブラウザは、以前に訪れたページに関係なく動作します。

リソースに価値があるなら、それらを保護し、リンクが貼られているトピックにそのリンクを配布するのはどうでしょうか。これにより、あなたのサイトに登録する追加のインセンティブが生まれます。

「いいね!」 1

ブラウザは気にしませんが、サーバーは可能です。デフォルトでは、ブラウザがリファラーを含むページと同じオリジンに対してリクエストを行う場合、サーバーにどこから来たのかを伝えるためにリファラーヘッダーを含めます。サーバーはこの情報を使用して、特定の場所へのアクセスを許可または拒否するなど、動作に影響を与えることができます。

回避は簡単ですが、他のウェブサイトからの偶発的なリンクを防ぐことができます。

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

Simon、共有してくれてありがとう。これは私の要件に対する解決策になり得るかもしれませんが、Discourse にどう適用するかはまだわかりません。Linux サーバーと Apache については少し知っていますが、Discourse は Docker と Nginx を使用しており、どちらも私の知識の範囲外です。とにかく、Simon が方向性を示してくれたので、何かできるか調べてみます。

「いいね!」 1

実は、Discourse が nginx で使用する設定には、すでにホットリンク防止のための記述が含まれていますが、コメントアウトされています。そのため、app.yml ファイルにいくつかの置換を追加して、これらの行のコメントを解除することができます。

お好みのエディタで /var/discourse/containers/app.yml を編集してください。ファイルの末尾には run セクションがあり、その中に echo "end of custom commands" を実行する exec が記述されています。

その 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 /; }

最初の置換セクションにある to: の行には mysite.com *.mysite.com とありますが、これを自分のドメイン名に置き換えてください。例えば discourse.org *.discourse.org のようにします。2 番目の置換は、訪問者を Discourse のホームページにリダイレクトしたいという前提に基づいています。

変更を保存した後、以下のコマンドを実行して、更新された nginx 設定で Discourse を再構築してください。

cd /var/discourse
./launcher rebuild app
「いいね!」 4