Почему мой Symfony2 устанавливает 404 при доступе app.php?


В Symfony2 при локальном доступе к моему приложению через app_dev.php , все работает нормально. Однако, когда я получаю доступ app.php это 404s:

Упс! Произошла ошибка

Сервер вернул сообщение "404 Не найдено".

Что-то сломано. Пожалуйста, напишите нам по электронной почте [email] и сообщите нам, что вы делали, когда произошла эта ошибка. Мы исправим это как можно скорее. Извините за

Author: j0k, 2011-08-09

12 answers

Новая установка symfony 2 не содержит маршрутизации для производственной среды. Если вы посмотрите в разделе app/config/routing_dev.yml, вы заметите, что все маршруты, которые вы видите в демонстрационном приложении, определены только для разработки. Если вы хотите протестировать демонстрационную версию на app.php, вам необходимо сначала скопировать маршрут с routing_dev.yml на routing.yml, а также включить AcmeDemoBundle под вами AppKernel.php:

$bundles = array(
        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
        new Symfony\Bundle\SecurityBundle\SecurityBundle(),
        new Symfony\Bundle\TwigBundle\TwigBundle(),
        new Symfony\Bundle\MonologBundle\MonologBundle(),
        new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
        new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
        new Symfony\Bundle\AsseticBundle\AsseticBundle(),
        new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
        new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
+       new Acme\DemoBundle\AcmeDemoBundle()
    }

if (in_array($this->getEnvironment(), array('dev', 'test'))) {
-       $bundles[] = new Acme\DemoBundle\AcmeDemoBundle();
        $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
        $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
        $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
    } 

(+ - строка, которую вы должны добавить, - строка, которую вы должны удалить)

 22
Author: Nemanja Miljković, 2011-08-09 14:52:07

У меня была та же проблема, и я только что очистил кэш. php app/console cache:clear --env=prod Это решило мою проблему.

Не присваивайте атрибуту значение true: $ kernel = new AppKernel ('prod', TRUE); это активирует режим отладки, и это не рекомендуется для prod.

 17
Author: youssman, 2013-11-22 12:27:40

Была та же проблема.

На самом деле может возникнуть несколько проблем. но вы должны очистить кэш с помощью консольной команды, так как symfony кэширует маршруты, шаблоны и конфигурацию.

 4
Author: Raffael, 2017-05-23 11:54:17

Это обычное кэширование Symfony, выполняющее свою работу. Любые изменения, которые вы внесете, будут доступны для просмотра/тестирования в app_dev.php (среда разработки), но не в app.php (производственная среда), так как она все кэширует.

Я следую простому правилу, которое работает. Каждый раз, когда я обновляю что-либо в app\config\routing.yml (или любое изменение на самом деле), и я хочу видеть это в рабочей среде, вам нужно ОЧИСТИТЬ КЭШ , выполнив следующую консольную команду:

Симфония 2.*: php app/console cache:clear --env=prod

Симфония 3.*: php bin/console cache:clear --env=prod

Теперь попробуйте перезагрузить страницу в своем браузере, и вы увидите, что она работает.

 4
Author: CodeGodie, 2017-06-11 14:40:58

Хорошо, у меня была та же проблема, и очистка кэша не решила ее. После часа чтения сообщений, где все говорят "очистить кэш", я решил по-настоящему понять, что происходит. Поэтому я постараюсь объяснить другим людям, таким как я (которые только начали). Надеюсь, я не ошибаюсь, и если да, поправьте меня, пожалуйста.

Я предполагаю, что вы следуете учебнику по книге, где у вас есть Acme/DemoBundle. И доступ к нему из производственной среды дает вам 404. Прежде всего, вы должны имейте четкое представление о том, что означает связка в Symfony. Это что-то вроде плагина. Это похоже на головоломку. Symfony подобен большой головоломке, и ваше приложение - это часть головоломки.

Итак, сначала давайте заглянем в файл AppKernel.php в ./app. То, что мы видим там, - это регистрация пакетов. Как будто складываешь кусочки головоломки. И сначала мы говорим: "Хорошо, мне нужны основные части головоломки, пакеты Symfony", а затем мы говорим: "и если я нахожусь в режиме отладки, я также хочу некоторые другие части". И есть ваш кусок, твой сверток. Так вот почему вы не можете получить к нему доступ из производственной среды. Вы регистрируете пакет только в среде разработчика. Зарегистрируйте свой пакет (Acme/DemoBundle/AcmeDemoBundle) в верхней части, и вы сможете получить к нему доступ из рабочей среды.

Во-вторых, войдите в ./app/config/routing_dev.yml. Это маршрут для среды разработки. Мы говорим: "Хорошо, у меня есть некоторая информация о маршрутизации в @AcmeDemoBundle/Resources/config/routing.yml, и в среде разработки наш пакет найден. Но загляните в ./app/config/routing.yml. Мы ничего не упоминаем о нашем обычае маршрутизация. Это похоже на то, что Фреймворк не знает о существовании нашего файла маршрутизации. И это в производственной среде. Поэтому добавление последней части routing_dev.yml в routing.yml./app/config/) должно решить проблему.

После этого очистите кэш и проверьте, работает ли /app.php/random/[number]. Так и должно быть.

Я надеюсь, что это поможет кому-то вроде меня понять некоторые основы.

 3
Author: hackohackob, 2015-03-19 22:31:16

Когда вы следуете ответу Антона и все равно получаете ошибку, вы можете попробовать следующий способ

В routing.yml добавьте эти строки (только)

_welcome:
    pattern:  /
    defaults: { _controller: AcmeDemoBundle:Welcome:index }

_demo_secured:
    resource: "@AcmeDemoBundle/Controller/SecuredController.php"
    type:     annotation

_demo:
    resource: "@AcmeDemoBundle/Controller/DemoController.php"
    type:     annotation
    prefix:   /demo

Не добавляйте эти строки

_assetic:
    resource: .
    type:     assetic

_wdt:
    resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml"
    prefix:   /_wdt

_profiler:
    resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml"
    prefix:   /_profiler

_configurator:
    resource: "@SensioDistributionBundle/Resources/config/routing/webconfigurator.xml"
    prefix:   /_configurator

_main:
    resource: routing.yml

Это пример routing.yml, который я написал

# Internal routing configuration to handle ESI
#_internal:
#   resource: "@FrameworkBundle/Resources/config/routing/internal.xml"
#   prefix:   /_internal
_welcome:
    pattern:  /
    defaults: { _controller: AcmeDemoBundle:Welcome:index }

_demo_secured:
    resource: "@AcmeDemoBundle/Controller/SecuredController.php"
    type:     annotation

_demo:
    resource: "@AcmeDemoBundle/Controller/DemoController.php"
    type:     annotation
    prefix:   /demo
 2
Author: Misbah, 2011-09-21 22:45:39

Я должен согласиться с Эндрю.

Включение второго ядра приложения в значение TRUE просто позволяет получить более четкое сообщение об отладке (и вы можете заметить, что приложение работает не быстрее, чем ожидалось).

В моем случае он сказал мне, что у меня нет _welcome маршрута, доступного для производства (т.Е. routing.yml).

Мне пришлось добавить следующие строки, как упоминалось Мисбой, и следовать другим распространенным процедурам, чтобы мое приложение работало на полной скорости.

_welcome:
    pattern:  /
    defaults: { _controller: AcmeDemoBundle:Welcome:index }
 2
Author: Olivier ROMAND, 2013-04-19 06:15:40

Похоже, вы неправильно настроили маршрутизацию.

Проверьте свой файл routing.yml, содержит ли он маршрут по умолчанию для /. Если нет, добавьте его в контроллер/действие, которое вы хотите запустить.

 1
Author: Florian Peschka, 2011-08-09 14:17:38

Ну, я нашел более простой и быстрый ответ:
первый:$kernel = new AppKernel('prod', TRUE);
На app.php файл.
Затем на вашем routing.yml (приложение/конфигурация/маршрутизация, а не ваш пакет) просто удалите сгенерированный по умолчанию код после объявления вашего маршрута.

_demo: resource: "@AcmeDemoBundle/Controller/DemoController.php"
type: annotation
prefix: /demo

Должен быть удален. После этого он теперь работает без проблем!

 0
Author: donald, 2012-12-09 19:34:03

Измените свою среду на developmet, чтобы использовать маршруты, настроенные в routes_dev.yml

$ядро = новое ядро приложения ('dev', true);

 0
Author: Pablo Merino, 2013-06-13 16:11:58

Отказ от ответственности: Я совершенно новичок в Symfony.

Исходя из других фреймворков, казалось странным, что вы не можете отключить среду/отладку на основе текущих переменных среды (т.Е. Путь/домен).

Поэтому я переименовал app.php в app_prod.php и обновил app.php следующим образом:

<?php

if ($_SERVER['HTTP_HOST'] == 'localhost') {
    require_once 'app_dev.php';
} else {
    require_once 'app_prod.php';
}

Поэтому, если я запускаю код на своем локальном компьютере, он будет использовать dev, если я запущу его в другом месте, он будет работать как рабочий. Очевидно, вы можете добавить любые проверки, которые хотите, проверить наличие пути к файлам staging/production/dev вместо имен хостов.

 0
Author: Kus, 2014-05-03 08:02:35

Эта проблема меня очень беспокоит, и вот мое решение: Сначала измените строку файла 21 следующим образом:

$kernel = new AppKernel('prod', true);

Тогда у вас могут возникнуть проблемы с отчетностью при просмотре/app.php

На самом деле я внес эти изменения, чтобы избежать "ошибки 404":

В appKernel.php : комментарий

$bundles[] = new Acme\DemoBundle\AcmeDemoBundle();

Добавить

new Acme\DemoBundle\AcmeDemoBundle()

В нижней части функции registerBundles();

Добавить

# AcmeDemoBundle routes (to be removed)
_acme_demo:
    resource: "@AcmeDemoBundle/Resources/config/routing.yml"

Для маршрутизации.yml

Мне жаль, что я не знаю, как использовать виджет фрагмента кода хорошо, Но я надеюсь, что смогу вам помочь.

 0
Author: Leon Jiang, 2015-01-20 09:10:07