可能会强制Codeigniter控制器处理到文件的直接链接


Possible to force Codeigniter controller to handle direct link to file?

我觉得这是不可能的,但我想无论如何都要检查一下。

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

我想做的是有一个名为发票提货请求的控制器https://www.domain.tld/invoice/22/xy38yrv4629mg7.pdf所以我可以运行一个安全检查,以确保用户可以下载该文件,然后让CI给他们下载该文件。这是可能的还是CI无法控制的?

我有一种感觉,web服务器在CI有机会启动之前就将请求识别为文件。我可以将发票目录从webfoot中移出并以这种方式进行操作,但我认为我应该首先明确排除这种方法。

查看.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";

现在,如果您调用上面的路径,那么将调用类invoice中具有2个参数的方法download

$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        
}

默认情况下,CI应用程序会将传入GET请求中的段解释为"controller/action/id"我认为你不想改变路由协议。这样做会破坏使用MVC框架的目的。这也很费力。最后,它创建了令人困惑的遗留代码。

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