您好,我使用 codeigniter 开发我的网站,但是当我在 google 中搜索我的网站时,google 会显示指向特定文件夹中文件 (pdf) 的链接,用户无需登录即可直接查看这些文件 (pdf)。我想限制谷歌直接显示这些文件的链接。例如:www.mywebsite/myfolder/myfile
请指导我如何做到这一点。谢谢你。
您好,我使用 codeigniter 开发我的网站,但是当我在 google 中搜索我的网站时,google 会显示指向特定文件夹中文件 (pdf) 的链接,用户无需登录即可直接查看这些文件 (pdf)。我想限制谷歌直接显示这些文件的链接。例如:www.mywebsite/myfolder/myfile
请指导我如何做到这一点。谢谢你。
对上一个答案稍作修改:
将 .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
认为这可能会有所帮助:)
基本上,您需要将文件托管在 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);
}
}
}
}
}
注意:您需要小心目录转换 - 因此您应该检查文件名是否仅由字母组成
只需在之前添加以下代码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;
}
}