如果文件存在,请让Apache处理请求,否则通过Symfony前端控制器路由它

时间:2016-12-01 23:58:38

标签: php apache .htaccess symfony symfony-routing

我有一个非常遗留的php应用程序,我正在尝试更新到Symfony。

该应用程序目前具有与此类似的结构:

/www                        <-current web root
php_page1.php
php_page2.php
php_pagen.php
    /dashboard
    dashboard_page1.php
    dashboard_page2.php
    dashboard_pagen.php

这些页面包含充满函数等的辅助文件,还有一些文件夹中充满了资源,但这并不重要。因此,要访问给定页面,您需要将浏览器指向domain.com/php_page1.php或domain.com/dashboard/dashboard_page1.php ...没有前端控制器。所有页面都可以直接访问。

总而言之,一次重构太多了,所以我想在peices中做,一次一页。

我想要做的是在我现在拥有的基础上安装symfony,因此symfony结构将与当前的内容共存:

/www                        <-legacy
php_page1.php               <-legacy
php_page2.php               <-legacy
php_pagen.php               <-legacy
    /app                    <-symfony
    /dashboard              <-legacy
        dashboard_page1.php <-legacy
        dashboard_page2.php <-legacy
        dashboard_pagen.php <-legacy
    /src                    <-symfony
    /web                    <-symfony (new web root)
        .htaccess           <-symfony (points to app.php)
        app.php             <-symfony (front controller)

我已成功安装Symfony并迁移了示例旧版页面(请注意已移动了Web根目录)。这很有效。

问题是,最终,如果遗留页面存在,我需要Apache来提供服务,如果不存在,我需要通过前端控制器(app.php)。

这是我尝试过的。

我尝试了各种.htaccess规则来尝试在/ www和/ www / dashboard中创建Apache服务文件。这些失败了,Symfony告诉我没有可以匹配的路线。

我也尝试过Symfony的$this->redirect('..\www\php_page1.php');。这失败了Symfony告诉我“看起来你试图在配置目录之外加载模板。”

最后,我尝试添加/ dashboard作为路线:

/**
 * @Route("/cvdashboard/{file}")
 */
public function cvdashboardAction($file)  {
    return $this->render("@dashboard/$file");
}

并添加了一条树枝路径:

twig:
    ...
    paths:
      '%%kernel.root_dir%/../dashboard':dashboard

这有三个例外:

FileLoaderLoadException in FileLoader.php第118行:

InvalidArgumentException in YamlFileLoader.php第371行:

ParseException in Inline.php第108行:

问题

所以我的问题是: 我如何配置Symfony / Apache,如果调用当前存在的url(即domain.com/php_page1.php),它将通过Symfony或Apache直接提供该页面,如果它不存在,请让Symfony的前端控制器处理请求?

修改

这是我目前拥有的.htaccess:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . app_dev.php [L]

这适用于Symfony并路由我有定义路线的任何内容。问题是它在/ www / web(新的web根目录)中,这是Symfony想要Web根目录的地方。它不会访问/ www或/ www / dashboard中的任何内容,它位于Web根目录之外。

我正在尝试使用.htaccess导致Apache从Web根目录下载文件,或者让Symfony将这些页面作为通用的PHP脚本提供。

1 个答案:

答案 0 :(得分:0)

你可以使用mod_rewrite:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d # not an existing dir
RewriteCond %{REQUEST_FILENAME} !-f # not an existing file

# redirect to the symfony app.php file
RewriteRule ^(.*)$ www/app.php [L]