1

このサイトはシルバーストライプで構築されており、メンバー専用のメンバーページがあります。

メンバーのページの1つにいくつかのpdfリンクを配置するまで、すべてがうまくいきました.Google検索は実際にそれらのpdfファイルを取得でき、メンバーでなくても誰もがそれらのpdfファイルを見ることができます.

メンバーのページにある場合、ログインする必要があります。URL は www.mysite.com/members/ ですが
、そのページのリンクの 1 つをクリックすると、URL が www.mysite/assets/Uploads に変わります。 /members/books/myfirstbook.pdf

誰かが本の名前、たとえば myfirstbook と mysite 名をグーグル検索する限り、メンバーのページに PDF リンクが表示され、それをクリックして PDF コンテンツを表示できます。

非会員がこれらの PDF ファイルを表示できないようにするにはどうすればよいですか? robot.txt とセキュア ファイル モデルを試しましたが、うまくいきませんでした。助けてください。ありがとう!

4

2 に答える 2

4

私はあるクライアントに似たようなことがありました。彼らは、どのページにもある可能性のあるファイルをダウンロードする前に、訪問者にフォームに情報を入力してもらいたいと考えていました。

基本的に私がしたことは、AssetAdmin の下にフォルダーを作成し、FilteredDownloadそのフォルダー内の任意の場所がフィルタリング (フォームなど) を通過することです。

私はこのルールを.htaccess(編集することができます...)これらのファイルのいずれかにリクエストをリダイレクトしますDownloader_Controller

RewriteCond %{REQUEST_URI} /assets/FilteredDownload [NC]
RewriteCond %{REQUEST_URI} !/assets_temp [NC]
RewriteCond %{REQUEST_FILENAME} \.(pdf|zip|rar|7z|doc|docx|xls|xlsx|ppt|pptx)$ [NC]
RewriteRule .* downloader?file=%{REQUEST_FILENAME}&%{QUERY_STRING} [L,NC]

次に、そのコントローラーを使用して、フォームとファイルをサーバーに配置しました。

あなたの場合、そのコントローラーを使用して、訪問者がログインしているかどうかをテストし、そうでない場合はログインページにリダイレクトしたり、アクセスを拒否したりできます...

あなたの問題とまったく同じではありませんが、これが適応されているのは簡単にわかりますか?


編集

それをよく見て、上記に基づいて、これはうまくいくようです:

シルバーストライプ 3+

これをに追加.htaccess

RewriteCond %{REQUEST_URI} /assets/MembersOnly [NC]
RewriteCond %{REQUEST_FILENAME} \.(pdf|zip|rar|7z|doc|docx|xls|xlsx|ppt|pptx)$ [NC]
RewriteRule .* filedownloadpermission?file=%{REQUEST_FILENAME}&%{QUERY_STRING} [L,NC]

したがって、アップロードされたすべてのファイルは、ダウンロード前に/assets/MembersOnly最初にリクエストが通過し/filedownloadpermissionます。

Directorでルールを定義しconfig.ymlます。

---
Name: myroutes
After: framework/routes#coreroutes
---
Director:
  rules:
    'filedownloadpermission/$Action/$ID/$Name': 'FileDownloadPermission_controller'

次にFileDownloadPermission_controller.php、ファイルを提供する前にパーミッションをチェックするコントローラー:

<?php

class FileDownloadPermission_controller extends ContentController
{
    private static $allowed_actions = array (
    );

    public function init() {
        parent::init();

        if( !$member = Member::currentUser() )
        {
                  Security::permissionFailure();
        }    
    }

    public function index()
    {
        $file = $this->request->getVar('file');
        $fileAssetPath = substr($file, stripos($file, 'assets'));    
                $fileObj = File::get()->filter(array('Filename' => $fileAssetPath))->first();

                if ( $fileObj )
                {
                   $data = file_get_contents( $fileObj->getFullPath() );
                   $name = $fileObj->getFilename();
                   $response = SS_HTTPRequest::send_file($data, $name);
                   return $response;
                }
                else {
                   //Return 404 or whatever...
                }
    }
}

これは実際には SilverStripe 3.1 用に書かれていますが、2.4 にも簡単に適用できます。

  • $allowed_actionsする必要がありますpublic
  • Director_config.php代わりに追加するルール
  • File::get()...に更新DataObject::get...

これにより、SilverStripe 2.4+が提供されます。

_config.php

Director::AddRules(100, array('filedownloadpermission/$Action/$ID/$OtherID' => 'FileDownloadPermission_controller'));

そして私たちのコントローラーFileDownloadPermission_controller.php

<?php

class FileDownloadPermission_controller extends ContentController
{
    static $allowed_actions = array (
    );

    public function init() {
        parent::init();

        if( !$member = Member::currentUser() )
        {
                  Security::permissionFailure();
        }    
    }

    public function index()
    {
        $file = $this->request->getVar('file');
        $fileAssetPath = substr($file, stripos($file, 'assets')); 
                $fileObj = DataObject::get(
                                 "File",
                                 "Filename = '".$fileAssetPath."'",
                                 null, null, "1");

                if ( $fileObj )
                {
                    $fileObj = $fileObj->shift();

                    $data = file_get_contents( $fileObj->getFullPath() );
                    $name = $fileObj->getFilename();
                    $response = SS_HTTPRequest::send_file($data, $name);
                    return $response;
                }
                else {
                    //Return 404 or whatever...
                }
    }
}

これは非常に迅速な解決策であり、おそらくもう少し良くなる可能性がありますが、良いスタートが切れるはずです_

于 2013-05-24T18:38:56.147 に答える