通过symfony2路由现有的静态html页面

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页面.

Hai*_*ian 3

一旦 Symfony 处理了请求,我认为不可能再允许 Apache 提供文件服务了。您需要做的是在 Symfony 框架的上下文中提供请求的文件。

想法#1

一种可能的实现是将文件的内容加载到响应对象中,并从适当的控制器返回该对象。路由定义看起来不错,因此 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 类),如果您选择走这条路,您可以考虑使用它们。

想法#2

另一种可能更简单的实现是让 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)

只是一些值得深思的东西。

注意:我没有在上面的控制器示例中处理身份验证。当然,您需要合并您已实施的任何身份验证方法。我假设您了解如何做到这一点,因为您的问题没有直接询问身份验证。