我觉得这是不可能的,但我想我还是要检查一下。
我在webroot中有一个名为发票的目录,里面是id(22,65等)的每个用户的目录,其中每个都是用户的发票,其中包含随机字符串名称,如xy38yrv4629mg7.pdf。 / p>
我想做的是有一个叫做发票提取请求的控制器 https://www.domain.tld/invoice/22/xy38yrv4629mg7.pdf所以我可以运行安全检查以确保允许用户下载该文件,然后让CI为他们提供下载文件。这是可能的还是在CI的控制范围之外?
我感觉Web服务器在CI甚至有机会启动之前将请求标识为文件。我可以将发票目录从webfoot中移出并按照这种方式进行,但我认为我最终会排除这种方法。
答案 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和目录路径来阻止用户访问随机发票。