在Symfony2中,当通过app_dev.php在本地访问我的应用程序时,一切正常。但是,当我访问app.php时,它是404s:
糟糕!发生错误
服务器返回“404 Not Found”。
有些东西坏了。请发送电子邮件至[email],告诉我们 发生此错误时你正在做什么。我们会尽快修复它 可能。对不起
答案 0 :(得分:22)
新的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();
}
(+是您应该添加的行, - 是您应删除的行)
答案 1 :(得分:17)
我遇到了同样的问题,我刚刚清除了缓存。 php app/console cache:clear --env=prod
这解决了我的问题。
不要将该属性设置为true:$ kernel = new AppKernel ('prod', TRUE);
它将激活调试模式,不建议用于prod。
答案 2 :(得分:4)
实际上可能存在一些问题。但是你必须使用console命令清除缓存,因为symfony会缓存路由,模板和配置。
答案 3 :(得分:4)
这是正常的Symfony缓存工作。您所做的任何更改都将在app_dev.php(开发环境)中查看/测试,但不会在app.php(生产环境)中进行,因为它会缓存所有内容。
我遵循一条有效的简单规则。每当我更新lock wait timeout exceeded try restarting transaction
中的任何内容(或任何真正的更改)并且我想在生产中看到它时,您必须通过运行以下控制台命令清除缓存:
Symfony 2. *:app\config\routing.yml
Symfony 3. *:php app/console cache:clear --env=prod
现在尝试在浏览器上重新加载页面,您将看到它正常工作。
答案 4 :(得分:3)
好的,我遇到了同样的问题,清除缓存无法解决问题。经过一个小时的阅读帖子,每个人都说“清除缓存”,我决定真正了解最新情况。所以我会尝试向像我这样的人(刚刚开始)解释。希望我没错,如果是的话,请纠正我。
我假设你正在阅读本书的教程,你有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]
是否有效。应该是。
我希望这能帮助像我这样的人,理解一些基础知识。
答案 5 :(得分:2)
当你按照安东的回答,仍然得到错误时,你可以尝试以下方式
在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
答案 6 :(得分:2)
我必须同意安德鲁。
将第二个AppKernel转为TRUE只允许更清晰的调试消息(您可能会注意到应用程序的速度并不比预期的快)。
在我的情况下,它告诉我我没有可用于生产的_welcome路线(即routing.yml)。
我必须添加Misbah提到的以下行,并按照其他常用程序使我的应用程序全速运行。
_welcome: pattern: / defaults: { _controller: AcmeDemoBundle:Welcome:index }
答案 7 :(得分:1)
您似乎没有正确设置路由。
检查routing.yml
文件是否包含/
的默认路由。如果没有,请在要运行的控制器/操作中添加一个。
答案 8 :(得分:0)
好吧,我找到了一个更简单,更快捷的答案:
第一:$kernel = new AppKernel('prod', TRUE);
在app.php文件中。
然后,在你的routing.yml(app / config / routing one,而不是你的bundle)
只需在声明路由后删除默认生成的代码。
_demo:
resource: "@AcmeDemoBundle/Controller/DemoController.php"
type: annotation
prefix: /demo
必须删除。在这样做之后,它现在正在没有问题!
答案 9 :(得分:0)
将您的环境更改为开发,以使用路由器dev.yml
中配置的路由$ kernel = new AppKernel('dev',true);
答案 10 :(得分:0)
免责声明:我对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,如果我在其他地方运行它将作为生产运行。您显然可以添加所需的任何检查,检查登台/生产/开发文件路径而不是主机名。
答案 11 :(得分:0)
问题困扰了我很多,这是我的解决方案: 首先像这样更改文件行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
对不起,我不知道如何使用代码段小部件, 但我希望我可以帮助你。