6

您好,我使用 codeigniter 开发我的网站,但是当我在 google 中搜索我的网站时,google 会显示指向特定文件夹中文件 (pdf) 的链接,用户无需登录即可直接查看这些文件 (pdf)。我想限制谷歌直接显示这些文件的链接。例如:www.mywebsite/myfolder/myfile

请指导我如何做到这一点。谢谢你。

4

3 回答 3

7

对上一个答案稍作修改:

将 .htaccess 与内容一起放在您的文件夹中

order deny, allow
deny from all

这将拒绝对该特定文件夹的所有访问。

为了访问文件,在控制器中编写一个带有正文的函数 -

public function index($file_name){
    if($this->login())  // login check
        if (preg_match('^[A-Za-z0-9]{2,32}+[.]{1}[A-Za-z]{3,4}$^', $file_name)) // validation
            {
            $file = 'my_path/'.$file_name;
            if (file_exists($file)) // check the file is existing 
                {
                header('Content-Type: '.get_mime_by_extension($file));
                readfile($file);
                }
            else show_404()
            }
    else    show_404();
}

然后你必须像这样在你的配置文件夹中的 routes.php 文件中添加一些行

$route['my_files/(:any)'] = "my_controller/index/$1";

这会将所有请求重定向到 myfiles/bla_bla_bla 到 my_controller/index/bla_bla_bla

认为这可能会有所帮助:)

于 2012-11-10T13:23:47.883 回答
0

基本上,您需要将文件托管在 public_html 文件夹之外 - 而是通过 php readfile() 将它们提供给用户。

像这样的东西会起作用

function user_files($file_name = "")
{
    // Check if user is logged in
    if($this->user->logged_in())
        {   
            // Now check the filename is only made up of letters and numbers
            // this helps prevent against file transversal attacks
            if (preg_match('^[A-Za-z0-9]{2,32}+[.]{1}[A-Za-z]{3,4}$^', $file_name)))
            {
                // Rewrite the request to the path on my server 
                $file = '../my_folder/'.$file_name;

                // Now check if file exists
                if (file_exists($file))
                {
                   // Serve the file
                   header('Content-Type: '.get_mime_by_extension($file));
                   readfile($file);
               }
            }
        }
    }
}

注意:您需要小心目录转换 - 因此您应该检查文件名是否仅由字母组成

于 2012-09-03T11:57:48.293 回答
0

只需在之前添加以下代码readfile($file)。这将有助于浏览器读取图像和视频文件。

ob_clean();
flush();

完整示例

if($this->user->logged_in())
{
    if (file_exists($file))
    {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: '.filesize($file));
        ob_clean();
        flush();
        readfile($file);
        exit;
    }
}
于 2019-12-20T10:04:19.793 回答