Пусть Apache обрабатывает запросы, если файл существует, в противном случае направьте его через фронт-контроллер Symfony

У меня очень устаревшее 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... нет фронт-контроллера. Все страницы доступны напрямую.

В общем, слишком много всего нужно для рефакторинга, поэтому я хочу сделать это по-отдельности, по одной странице за раз.

То, что я хочу сделать, это установить 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 и перенес образец устаревшей страницы поверх (обратите внимание, что веб-корень перемещен). Это прекрасно работает.

Проблема, в конечном счете, в том, что мне нужно, чтобы Apache обслуживал устаревшие страницы, если они существуют, и проходил через фронт-контроллер (app.php), если их нет.

Вот что я попробовал.

Я пробовал различные правила.htaccess, чтобы заставить Apache обслуживать файлы в / www и / www / dashboard. Они терпят неудачу, с Symfony, говорящим мне, что нет никакого пути, чтобы соответствовать.

Я также пробовал Symfony's $this->redirect('..\www\php_page1.php');, Это терпит неудачу, когда Symfony говорит мне: "Похоже, вы пытались загрузить шаблон за пределами настроенных каталогов".

Наконец я попытался добавить / панель инструментов в качестве маршрута:

/**
 * @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 (новый веб-корень), где Symfony хочет, чтобы веб-корень был. Он не будет получать доступ к чему-либо в / www или / www / dashboard, который находится за пределами корневого каталога.

Я пытаюсь использовать.htaccess, чтобы либо заставить Apache захватывать файлы на один уровень ниже корневого веб-каталога, либо заставить Symfony обслуживать эти страницы в качестве общих сценариев php.

1 ответ

Вы можете использовать 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]
Другие вопросы по тегам