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

Php 可以强制Codeigniter控制器处理到文件的直接链接吗?,php,file,codeigniter,Php,File,Codeigniter,我有一种感觉,这是不可能的,但我想我会检查无论如何 我在webroot中有一个名为invoices的目录,里面是每个用户id(22、65等)的目录,每个目录中都有用户的发票,带有随机字符串名称,如xy38yrv4629mg7.pdf 我想做的是让一个名为invoice pick-up requests的控制器 因此,我可以运行安全检查,以确保允许用户下载该文件,然后让CI向他们提供该文件以供下载。这是可能的还是超出了CI的控制范围 我感觉web服务器在CI有机会启动之前就将请求识别为文件。我可以

我有一种感觉,这是不可能的,但我想我会检查无论如何

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

我想做的是让一个名为invoice pick-up requests的控制器 因此,我可以运行安全检查,以确保允许用户下载该文件,然后让CI向他们提供该文件以供下载。这是可能的还是超出了CI的控制范围


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

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


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

查看.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 frontcontroller。您将能够注册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        
}

您不应该直接调用该文件,而是应该有一个关系表,其中每个文件都有一个唯一的代码。在url中调用该代码时,您将验证是否允许用户获取该文件,如果允许,则读取该文件并将其写入标头响应(提示下载)。也就是说,永远不要透露我知道的文件路径,这是我已经知道的,我只是想知道上面是否可行。谢谢你的建议。我非常熟悉CI和您的所有建议,我只是想知道在尝试提供文件之前是否可以访问控制器。我创建了一个路由,将invoice/22/xyz.pdf请求转发到invoice/fetch/22/xyz.pdf,但它总是在使用控制器之前提取文件。我想我必须坚持使用关系表,并将发票存储在webroot之外。当然可以。我为自己是“显而易见的船长”而道歉。@redreggae似乎想出了一个相当聪明的解决方案。请告诉我们你的情况。干杯,真酷。我想我可能会使用更像RewriteRule^invoice/(.+)/(.+\.pdf)$invoice/fetch[L](语法是我脑子里想不出来的,我不是htaccess pro)!因为我不想继续为将来可能需要使用的其他文件添加扩展名。是的,这是个好主意。我也不是htaccess pro,所以我不能告诉你确切的语法。但是你知道这个想法,并且可以在这个基础上发展。这是个坏主意。如何防止未经授权的用户访问发票?@NeilGirardi使用上面的
RewriteCond
,您将无法直接访问除
(gif | jpe?g | png | js | css)
@redreggae之外的所有文件类型,但如果存在到特定PDF的路由,您将如何防止未经授权的用户访问它?