可以强制Codeigniter控制器处理直接链接到文件?

时间:2013-11-30 22:04:07

标签: php file codeigniter

我觉得这是不可能的,但我想我还是要检查一下。

我在webroot中有一个名为发票的目录,里面是id(22,65等)的每个用户的目录,其中每个都是用户的发票,其中包含随机字符串名称,如xy38yrv4629mg7.pdf。 / p>

我想做的是有一个叫做发票提取请求的控制器 https://www.domain.tld/invoice/22/xy38yrv4629mg7.pdf所以我可以运行安全检查以确保允许用户下载该文件,然后让CI为他们提供下载文件。这是可能的还是在CI的控制范围之外?

我感觉Web服务器在CI甚至有机会启动之前将请求标识为文件。我可以将发票目录从webfoot中移出并按照这种方式进行,但我认为我最终会排除这种方法。

2 个答案:

答案 0 :(得分:2)

查看.htaccess文件。应该有类似的东西:

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d

这些规则阻止将现有文件或目录重写为index.php。 将其更改为:

RewriteCond %{REQUEST_FILENAME} \.(gif|jpe?g|png|js|css)$ [OR]    
RewriteCond %{REQUEST_FILENAME} -d

通过这种方式,pdf文档的路径将被重写为index.php前端控制器。您可以注册pdf文档的路线,并在手动将文档发送到浏览器之前进行检查。

示例:

pdf文档的物理路径为https://www.domain.tld/invoice/22/xy38yrv4629mg7.pdf

在CodeIgniter中(我不使用它)路由应该是:

$route['invoice/(:num)/(:any)'] = "invoice/download/$1/$2";

现在,如果您调用上述路径,将调用类download中包含2个参数的方法invoice

$invoice->download(22, 'xy38yrv4629mg7.pdf');

在方法download中,您可以进行用户检查以防止未经授权的访问。

function download($userid, $pdfName)
{
    // check if file exists
    // do checks if logged in user is authorized
    // send file to browser with readfile/header        
}

答案 1 :(得分:0)

默认情况下,您的CI应用会将传入的GET请求中的细分解释为“controller / action / id”。我认为您不想改变该路由协议。这样做会破坏使用MVC框架的目的。这也很费劲。最后,它会产生令人困惑的遗留代码。

相反,我认为你想调整你的控制器和方法来使用它。您的应用是否拥有用户帐户?如果是这样,可以将任何控制器的任何方法设置为检查有效会话。此方法可用于将未经授权的用户重定向到主页。一旦确定用户已登录,她应该只需要向控制器的getInvoice()方法提供文档ID。您应该能够通过跨关系数据库进行连接,将其与正确的目录路径和文件名相匹配。您的.htacess文件应该通过猜测URL和目录路径来阻止用户访问随机发票。