web*_*jem 5 routing static-files symfony
我目前有一个实时的Symfony2.4应用程序,它也链接到我们服务器上的一个目录(称为"指南"),该目录位于"web"文件夹下.此文件夹中的文件是使用外部程序自动生成的,由我们公司的其他部门生成普通的html文件.
最初我们将这些文件向公众开放,但是如果用户登录到应用程序,我们只想使它们可访问.我们已经设置了站点来处理登录过程等等,我只是无法弄清楚如何通过Symfony路由静态文件,以便我可以让它使用安全过程来检查用户是否有权查看文件.
我知道Symfony已经设置好,静态文件会自动提供,所以我修改了htaccess文件以包含这个:
凡是是一个文件,不是在"指南"目录应该只得到服务.
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} !/guides/
RewriteRule .? - [L]
Run Code Online (Sandbox Code Playgroud)
然后我尝试创建一个路径,可以捕获来自该目录的所有URL并通过一个特殊的控制器,我可以检查授权用户,如果不好则重定向到登录,或者如果好的话显示实际页面.
support_guides:
path: /guides/{the-rest}
defaults: { _controller: MillenniumSIMeevoSupportBundle:HelpGuide:show }
Run Code Online (Sandbox Code Playgroud)
htaccess似乎有用(我认为),因为它不会尝试直接提供页面,但现在我只是得到了Symfony 404页面.
一旦 Symfony 处理了请求,我认为不可能再允许 Apache 提供文件服务了。您需要做的是在 Symfony 框架的上下文中提供请求的文件。
一种可能的实现是将文件的内容加载到响应对象中,并从适当的控制器返回该对象。路由定义看起来不错,因此 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.");
}
}
Run Code Online (Sandbox Code Playgroud)
Symfony 有一些文件管理组件(如 Finder 类),如果您选择走这条路,您可以考虑使用它们。
另一种可能更简单的实现是让 Guide 文件夹存在于 twig 模板目录结构中(或与那里进行符号链接),您可以在其中直接在控制器中渲染请求的文件:
// MillenniumSIMeevoSupportBundle:HelpGuide controller
return $this->render("MillenniumSIMeevoSupportBundle:HelpGuide:{$filename}.html");
Run Code Online (Sandbox Code Playgroud)
或者使用您在同一文件夹中创建的简单“twigguide”加载器模板中的include 标签加载文件。
// MillenniumSIMeevoSupportBundle:HelpGuide controller
return $this->render('MillenniumSIMeevoSupportBundle:HelpGuide:guideloader.twig.html', array('filename' => $filename));
Run Code Online (Sandbox Code Playgroud)
...
// guideloader.twig.html
{% include filename ignore missing %}
Run Code Online (Sandbox Code Playgroud)
只是一些值得深思的东西。
注意:我没有在上面的控制器示例中处理身份验证。当然,您需要合并您已实施的任何身份验证方法。我假设您了解如何做到这一点,因为您的问题没有直接询问身份验证。
| 归档时间: |
|
| 查看次数: |
4882 次 |
| 最近记录: |