Подтвердить что ты не робот

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

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

Oops! Произошла ошибка

Сервер возвратил "404 Not Found".

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

4b9b3361

Ответ 1

Свежая установка 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();
    } 

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

Ответ 2

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

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

Ответ 3

Имела ту же проблему.

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

Ответ 4

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

Я следую простому правилу, которое работает. Каждый раз, когда я обновляю что-либо в app\config\routing.yml (или любое изменение действительно), и я хочу видеть его в процессе производства, вы должны CLEAR THE CACHE, выполнив следующую консольную команду:

Symfony 2. *: php app/console cache:clear --env=prod

Symfony 3. *: php bin/console cache:clear --env=prod

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

Ответ 5

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

Я предполагаю, что вы следуете учебному пособию, где у вас 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. Мы ничего не говорим о нашей настраиваемой маршрутизации. Это похоже на Framework doesn ' t знать о существовании нашего файла маршрутизации, и это в производственной среде, поэтому добавление последней части routing_dev.yml в routing.yml./app/config/) должно устранить проблему.

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

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

Ответ 6

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

В 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

Ответ 7

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

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

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

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

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

Ответ 8

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

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

Ответ 9

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

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

Необходимо удалить. После этого он работает без проблем!

Ответ 10

измените вашу среду на developmet, для использования маршрутов, сконфигурированных в routes_dev.yml

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

Ответ 11

Отказ от ответственности: я совершенно не знаком с 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, если я запустил его где-нибудь еще, он будет работать как производство. Вы можете, очевидно, добавить какие-либо проверки, которые вы хотите, проверить на пути создания/производства/dev файлов вместо имен хостов.

Ответ 12

Проблема беспокоит меня много, и вот мое решение: Сначала измените строку файла 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"

to routing.yml

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