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

通过symfony2路由现有静态html页面,symfony,routing,static-files,Symfony,Routing,Static Files,我目前有一个live Symfony2.4应用程序,它还链接到服务器上的一个目录(称为“指南”),该目录位于“web”文件夹下。本文件夹中的文件由本公司其他部门使用外部程序自动生成为纯html文件 最初,我们将这些文件向公众开放,但我们希望仅当用户登录到应用程序时才能访问这些文件。我们已经设置了网站来处理登录过程,我就是不知道如何通过Symfony路由静态文件,这样我就可以使用安全过程来检查用户是否有权查看文件 我知道Symfony的设置是为了自动提供静态文件,因此我修改了htaccess文件,

我目前有一个live Symfony2.4应用程序,它还链接到服务器上的一个目录(称为“指南”),该目录位于“web”文件夹下。本文件夹中的文件由本公司其他部门使用外部程序自动生成为纯html文件

最初,我们将这些文件向公众开放,但我们希望仅当用户登录到应用程序时才能访问这些文件。我们已经设置了网站来处理登录过程,我就是不知道如何通过Symfony路由静态文件,这样我就可以使用安全过程来检查用户是否有权查看文件

我知道Symfony的设置是为了自动提供静态文件,因此我修改了htaccess文件,以包括以下内容:

任何文件且不是在“指南”目录中的文件都应该得到服务

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} !/guides/
RewriteRule .? - [L]
然后,我尝试创建一个路由,该路由可以捕获来自该目录的所有URL,并通过一个特殊的控制器,在该控制器中,我可以检查授权用户并重定向到登录(如果不正确),或者显示实际页面(如果正确)

support_guides:
  path: /guides/{the-rest}
  defaults: { _controller: MillenniumSIMeevoSupportBundle:HelpGuide:show }

htaccess似乎可以工作(我认为),因为它不尝试直接为页面提供服务,但现在我只得到Symfony 404页面。

一旦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.");
    }
}
Symfony有一些文件管理组件(比如Finder类),如果您选择这样做,您可以使用这些组件

想法2 另一个可能更简单的实现是将指南文件夹存在于细枝模板目录结构中(或符号链接到/从此处),您可以在控制器中直接呈现请求的文件:

// MillenniumSIMeevoSupportBundle:HelpGuide controller
return $this->render("MillenniumSIMeevoSupportBundle:HelpGuide:{$filename}.html");
或者使用在同一文件夹中创建的简单“细枝指南”加载程序模板中加载文件

// MillenniumSIMeevoSupportBundle:HelpGuide controller
return $this->render('MillenniumSIMeevoSupportBundle:HelpGuide:guideloader.twig.html', array('filename' => $filename));

只是一些值得思考的东西

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

// guideloader.twig.html
{% include filename ignore missing %}