为什么当我访问app.php时,我的Symfony2安装404?

在Symfony2中,当通过app_dev.php在本地访问我的应用程序时,一切正常。 但是,当我访问app.php 404s:

哎呀! 发生错误

服务器返回“404未find”。

东西坏了 请发送电子邮件给我们[电子邮件],让我们知道你在做什么,当这个错误发生。 我们会尽快解决。 为。。。道歉

新的symfony 2安装不包含生产环境的任何路由。 如果你看一下app/config/routing_dev.yml ,你会注意到你在演示应用程序中看到的所有路由只是为了开发而定义的。 如果你想testingapp.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(); } 

(+是你应该添加的行, – 是你应该删除的行)

我有同样的问题,我只是清除caching。 php app/console cache:clear --env=prod这已经解决了我的问题。

不要把这个属性设置为true: $ kernel = new AppKernel ('prod', TRUE); 它会激活debugging模式,不build议使用该产品。

有同样的问题 。

实际上可能有几个问题。 但是必须使用console命令清除caching,因为symfony会caching路由,模板和configuration。

这是正常的Symfonycaching工作。 你所做的任何更改都将在app_dev.php(开发环境)中实时查看/testing,而不是在app.php(生产环境)中,因为它会caching所有内容。

我遵循一个简单的规则。 每次我更新app\config\routing.yml任何内容(或者真的有任何改变),我想在生产中看到它,你必须通过运行下面的控制台命令清除caching

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

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

现在尝试在您的浏览器上重新加载页面,您将看到它的工作。

好吧,我有同样的问题,并清除caching没有解决它。 经过一个小时的阅读,每个人都说“清除caching”的职位,我已经决定真正理解发生了什么事情。 所以我会试着向像我这样的其他人解释(刚刚开始)。 希望我没有错,如果是这样,请纠正我。

我假设你正在学习本书的教程,在这里你有Acme/DemoBundle 。 并从生产环境访问它给你404 。 首先,你应该清楚的知道Symfony中的包是什么意思。 这就像一个插件。 这就像一个谜题。 Symfony就像一个巨大的难题,你的应用程序是一个难题。

所以首先让我们看一下AppKernel.php中的AppKernel.php文件。 我们看到的是注册捆绑。 就像把拼图的碎片。 首先我们说“好的,我想要拼图的主要部分,Symfony包”,然后我们说“如果我在debugging模式下,我也想要其他的东西”。 还有你的一块,你的包。 所以这就是为什么你不能从生产环境中访问它。 您只能从开发人员环境注册该软件包。 在顶部注册您的包( Acme/DemoBundle/AcmeDemoBundle ),您可以从生产环境中访问它。

其次,进入./app/config/routing_dev.yml 。 这是开发环境的路由。 我们在说:“好吧,我在@AcmeDemoBundle/Resources/config/routing.yml有一些路由信息,在开发环境中,我们发现了bundle,但是在./app/config/routing.yml./app/config/routing.yml 。提到我们的自定义路由的任何东西,就像框架不知道我们的路由文件的存在,这是在生产环境中,因此将routing_dev.yml的最后一部分添加到routing.yml (在./app/config/ )应该解决这个问题。

之后清除caching并检查/app.php/random/[number]工作。 它应该是。

我希望这会帮助像我这样的人,理解一些基础知识。

当你按照安东的回答,仍然得到错误,你可以尝试下面的方法

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 

我必须同意安德鲁。

将第二个AppKernel设置为TRUE只是允许更清晰的debugging信息(并且您可能会注意到应用程序没有比预期的更快)。

就我而言,它告诉我,我没有可用于生产的欢迎路线(即routing.yml)。

我不得不按照Misbah的说法添加下面的代码,并遵循其他常见的程序来让我的应用程序全速运行。

 _欢迎:
    模式:/
    默认值:{_controller:AcmeDemoBundle:Welcome:index}

看起来你没有正确设置路由。

如果它包含/的默认路由,请检查您的routing.yml文件。 如果没有,请在要运行的控制器/操作中添加一个。

那么,我发现一个更简单,更快的答案:
第一个: $kernel = new AppKernel('prod', TRUE);
在app.php文件中。
然后,在您的routing.yml(应用程序/configuration/路由之一,而不是您的捆绑的),只是删除默认生成的代码后,你的路由声明。

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

必须删除。 这样做后,现在工作没有问题!

改变你的开发环境,使用route_dev.yml中configuration的路由

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

免责声明:我对Symfony完全陌生。

来自其他框架,似乎很奇怪,你不能根据当前的环境variables(即path/域)切换环境/debugging。

所以我把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文件path,而不是主机名。

这个问题困扰了我很多,这里是我的解决scheme:首先像这样改变文件行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" 

到routing.yml

对不起,我不知道如何使用代码片段小部件,但我希望我可以帮助你。