我目前有一个实时的Symfony2.4应用程序,它也链接到我们服务器上的一个目录(称为"指南"),该目录位于" web"夹。此文件夹中的文件是使用外部程序自动生成的,由我们公司的其他部门生成普通的html文件。
最初我们向公众开放了这些文件,但是如果用户登录到应用程序,我们只能让它们可访问。我们已经设置了站点来处理登录过程等等,我只是无法弄清楚如何通过Symfony路由静态文件,以便我可以使用安全过程来检查用户是否有权使用查看文件。
我知道Symfony已设置好以便自动提供静态文件,因此我修改了htaccess文件以包含此内容:
一个文件,"指南" 。目录应该得到服务。
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} !/guides/
RewriteRule .? - [L]
然后我尝试制作一条路线,可以捕获来自该目录的所有网址,并通过一个特殊的控制器,我可以检查授权用户,如果不好则重定向到登录,或者显示实际的页面,如果好的话。 / p>
support_guides:
path: /guides/{the-rest}
defaults: { _controller: MillenniumSIMeevoSupportBundle:HelpGuide:show }
htaccess似乎有用(我认为)因为它没有尝试直接提供页面,但现在我只是得到了Symfony 404页面。
答案 0 :(得分:1)
一旦Symfony处理了请求,我就不会认为允许Apache再次提供文件了。您需要做的是在Symfony框架的上下文中提供所请求的文件。
一种可能的实现方法是将文件的内容加载到Response对象中,并从相应的Controller返回该内容。路由定义看起来很好,因此HelpGuide控制器中的一个非常基本的showAction方法可能如下所示:
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
...
public function showAction($filename)
{
$file = "/path/to/file/{$filename}";
if (file_exists($file)) {
return new Response(file_get_contents($file));
} else {
throw new NotFoundHttpException("Guide {$filename} Not Found.");
}
}
Symfony有一些文件管理组件(如Finder类),如果您选择使用此路径,可以使用它们。
另一个可能更简单的实现是将指南文件夹存在于twig模板目录结构中(或符号链接到/来自那里),您可以在控制器中直接呈现所请求的文件:
// MillenniumSIMeevoSupportBundle:HelpGuide controller
return $this->render("MillenniumSIMeevoSupportBundle:HelpGuide:{$filename}.html");
或在简单的" twig指南中使用include tag加载文件"您在同一文件夹中创建的加载程序模板。
// MillenniumSIMeevoSupportBundle:HelpGuide controller
return $this->render('MillenniumSIMeevoSupportBundle:HelpGuide:guideloader.twig.html', array('filename' => $filename));
...
// guideloader.twig.html
{% include filename ignore missing %}
只是一些值得思考的东西。
注意:我没有在上面的控制器示例中处理身份验证。当然,您需要采用您已实施的任何身份验证方法。我假设您了解如何做到这一点,因为您的问题没有直接询问身份验证。