Пусть 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]