Php Silverstripe-谷歌只在会员页面上选择链接

Php Silverstripe-谷歌只在会员页面上选择链接,php,silverstripe,google-search,Php,Silverstripe,Google Search,我有这个网站建立在silverstripe,我有会员的网页只为会员 一切都很顺利,直到我在其中一个成员的页面上放置了一些pdf链接,然后谷歌搜索实际上可以提取这些pdf文件,每个人最终都可以在不成为成员的情况下查看这些pdf文件 我注意到当它出现在会员页面时,您必须登录,url是www.mysite.com/members/ 但是,当我单击该页面上的一个链接时,url会变为www.mysite/assets/Uploads/members/books/myfirstbook.pdf 只要有人在谷

我有这个网站建立在silverstripe,我有会员的网页只为会员

一切都很顺利,直到我在其中一个成员的页面上放置了一些pdf链接,然后谷歌搜索实际上可以提取这些pdf文件,每个人最终都可以在不成为成员的情况下查看这些pdf文件

我注意到当它出现在会员页面时,您必须登录,url是www.mysite.com/members/ 但是,当我单击该页面上的一个链接时,url会变为www.mysite/assets/Uploads/members/books/myfirstbook.pdf

只要有人在谷歌上搜索这本书的名字,比如myfirstbook和mysite,会员页面上的pdf链接就会显示出来,你可以点击它查看pdf内容


如何阻止非成员查看这些pdf文件?我尝试了robot.txt和安全文件模型,但它们不起作用。请帮忙。谢谢

robot.txt需要一些时间才能应用。然而,它并不能真正保护任何东西,它只是将其从搜索引擎的索引中删除

您尝试了哪个安全文件模块? 它不起作用的具体问题是什么


这只适用于SilverStripe 2.x。是否需要3.x的解决方案?

robot.txt需要一些时间才能应用。然而,它并不能真正保护任何东西,它只是将其从搜索引擎的索引中删除

您尝试了哪个安全文件模块? 它不起作用的具体问题是什么


这只适用于SilverStripe 2.x。你需要3.x的解决方案吗?

我有一个客户端也有类似的解决方案。他们希望访问者在下载可能在任何页面上的文件之前填写一份包含一些信息的表格

基本上,我所做的是在AssetAdmin下创建一个名为FilteredDownload的文件夹,该文件夹中的任何位置都将通过过滤表单等

我在.htaccess中有这个规则,可以编辑。。。将这些文件的任何请求重定向到Downloader\u控制器

然后我就用那个控制器来服务器表单和文件

在您的情况下,您可以使用该控制器来测试访客是否已登录,如果未将其重定向到登录页面,则拒绝访问或其他

与您的问题不完全相同,但我可以很容易地看到这一点

编辑

仔细看一下,基于上述情况,这似乎是可行的:

银条3+

将此添加到.htaccess:

因此,在/assets/MembersOnly下上载的每个文件在下载之前都将首先通过/filedownloadpowpermission传递其请求

在config.yml中定义控制器规则:

然后,我们的控制器FileDownloadPermission\u 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...
                }
    }
}
以及我们的控制器文件DownloadPermission\u controller.php:


这是一个非常快速的解决方案,可能会更好一些,但应该会给您一个良好的开端

我与一个客户有类似的情况。他们希望访问者在下载可能在任何页面上的文件之前填写一份包含一些信息的表格

基本上,我所做的是在AssetAdmin下创建一个名为FilteredDownload的文件夹,该文件夹中的任何位置都将通过过滤表单等

我在.htaccess中有这个规则,可以编辑。。。将这些文件的任何请求重定向到Downloader\u控制器

然后我就用那个控制器来服务器表单和文件

在您的情况下,您可以使用该控制器来测试访客是否已登录,如果未将其重定向到登录页面,则拒绝访问或其他

与您的问题不完全相同,但我可以很容易地看到这一点

编辑

仔细看一下,基于上述情况,这似乎是可行的:

银条3+

将此添加到.htaccess:

因此,在/assets/MembersOnly下上载的每个文件在下载之前都将首先通过/filedownloadpowpermission传递其请求

在config.yml中定义控制器规则:

然后,我们的控制器FileDownloadPermission\u 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...
                }
    }
}
以及我们的控制器文件DownloadPermission\u controller.php:


这是一个非常快速的解决方案,可能会更好一些,但应该会给您一个良好的开端\u

谢谢Xeraa,是的,我尝试了安全文件模块的链接,问题是该站点正在使用“KickAssets”上载资产文件夹的所有文件,我很难同时实现这两个功能。您能教我如何将安全文件和kickassets结合在一起吗?非常感谢。顺便说一句,我用的是SS2.4.5,所以应该没问题。你认为我应该使用robot.txt和“安全文件”吗?如果您能给我一些关于如何将安全文件和kickassets结合在一起的帮助/提示,我将不胜感激。谢谢。我想不会有任何问题
使用KickAssets—它只是一个用于管理文件的新后端,但不会改变内部结构。对于2.4版,我会使用Hamish的模块,可能会在入门时忽略KickAssets,您不需要自定义robots.txt。谢谢Xeraa,是的,我尝试了您的安全文件模块链接,问题是该站点使用“KickAssets”上载资产文件夹的所有文件,我很难同时实现这两个功能。您能教我如何将安全文件和kickassets结合在一起吗?非常感谢。顺便说一句,我用的是SS2.4.5,所以应该没问题。你认为我应该使用robot.txt和“安全文件”吗?如果您能给我一些关于如何将安全文件和kickassets结合在一起的帮助/提示,我将不胜感激。谢谢。我认为KickAssets不会有任何问题——它只是一个新的管理文件的后端,但不会改变内部结构。对于2.4,我会使用Hamish的模块,可能会在入门时忽略KickAssets,您不需要自定义robots.txt。是的,您的Director::addRules是正确的。这将添加到mysite/_config.php。然后在mysite/code下创建FileDownloadPermission_controller.php文件,这是一个很好的地方。记得用?flush=AllThank Colymba刷新缓存,是的,我就是这么做的,现在我有一个服务器错误显示错误页面,它将我从成员页面中注销。你认为我应该在哪里寻找问题?我还需要在你的代码或网站代码上更改其他地方才能使其正常工作吗?谢谢。什么样的服务器错误?500? 404? 你有日志吗?我还没有一个SS2.4安装我可以测试,所以很难说。让我们看看您首先遇到了什么错误。最后在SS2.4中测试了这一点,还有一些额外的东西需要降级。对不起。主要是DataObject::get。。。我已经用完整的SS2.4代码更新了答案。更新你的文件,看看进展如何。你是一个传奇,谢谢,它的工作。还有一个问题,有没有办法使PDF不被下载,而是在点击链接后显示在另一个选项卡上?或者必须下载它才能使此方法工作。我真的很感谢你的帮助,谢谢!是的,您的Director::addRules是正确的。这将添加到mysite/_config.php。然后在mysite/code下创建FileDownloadPermission_controller.php文件,这是一个很好的地方。记得用?flush=AllThank Colymba刷新缓存,是的,我就是这么做的,现在我有一个服务器错误显示错误页面,它将我从成员页面中注销。你认为我应该在哪里寻找问题?我还需要在你的代码或网站代码上更改其他地方才能使其正常工作吗?谢谢。什么样的服务器错误?500? 404? 你有日志吗?我还没有一个SS2.4安装我可以测试,所以很难说。让我们看看您首先遇到了什么错误。最后在SS2.4中测试了这一点,还有一些额外的东西需要降级。对不起。主要是DataObject::get。。。我已经用完整的SS2.4代码更新了答案。更新你的文件,看看进展如何。你是一个传奇,谢谢,它的工作。还有一个问题,有没有办法使PDF不被下载,而是在点击链接后显示在另一个选项卡上?或者必须下载它才能使此方法工作。我真的很感谢你的帮助,谢谢!
---
Name: myroutes
After: framework/routes#coreroutes
---
Director:
  rules:
    'filedownloadpermission/$Action/$ID/$Name': 'FileDownloadPermission_controller'
<?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...
                }
    }
}
Director::AddRules(100, array('filedownloadpermission/$Action/$ID/$OtherID' => 'FileDownloadPermission_controller'));
<?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...
                }
    }
}