【问题标题】:Why is my Symfony2 install 404ing when I access app.php?为什么我访问 app.php 时 Symfony2 安装 404ing?
【发布时间】:2011-10-23 06:37:57
【问题描述】:

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

哎呀!发生错误

服务器返回“404 Not Found”。

有些东西坏了。请在 [email] 给我们发电子邮件,让我们知道什么 发生此错误时您正在做的事情。我们会尽快修复 可能的。对不起

【问题讨论】:

  • 是的,它可能是重复的,但是这个问题的答案(尤其是 Misbah)比“symfony2 - 如何从“开发”切换到“产品”中的其他容器对我的帮助更大",所以我认为这个问题(和答案)应该保留在这里。

标签: php symfony frameworks


【解决方案1】:

全新的 symfony 2 安装不包含任何用于生产环境的路由。 如果您在app/config/routing_dev.yml 下查看,您会注意到您在演示应用程序中看到的所有路由都是为开发而定义的。如果你想在app.php上测试demo,你必须先把routing_dev.yml的路由复制到routing.yml,并在AppKernel.php下启用AcmeDemoBundle

$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);会激活调试模式,不推荐用于prod。

    【讨论】:

      【解决方案3】:

      Had the same problem.

      实际上可能有几个问题。但是你必须使用控制台命令清除缓存,因为 symfony 会缓存路由、模板和配置。

      【讨论】:

      • 我总是忘记你需要手动清除 prod 环境(或任何非调试环境)的缓存。
      【解决方案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 中的 bundle 是什么意思。它就像一个插件。这就像一个谜题。 Symfony 就像一个大拼图,而您的应用程序就是拼图中的一部分。

      首先,让我们查看./app 中的AppKernel.php 文件。我们看到的是注册包。就像拼图一样。首先我们说“好吧,我想要拼图的主要部分,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] 是否有效。应该是的。

      我希望这对像我这样的人有所帮助,了解一些基础知识。

      【讨论】:

        【解决方案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 只会让调试消息更清晰(您可能会注意到应用程序并没有比预期快)。

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

          我必须添加 Misbah 提到的以下行,并遵循其他常见程序才能让我的应用程序全速运行。

          _欢迎: 图案: / 默认值:{ _controller: AcmeDemoBundle:Welcome:index }

          【讨论】:

            【解决方案8】:

            您似乎没有正确设置路由。

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

            【讨论】:

            • 我应该在哪里添加这个?在文档中没有任何关于为运行 app.php 设置路由的内容
            【解决方案9】:

            好吧,我找到了一个更简单快捷的答案:
            第一:$kernel = new AppKernel('prod', TRUE);
            在 app.php 文件上。
            然后,在您的 routing.yml 上(app/config/routing 之一,而不是您的捆绑包) 只需在路由声明后删除默认生成的代码即可。

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

            必须删除。这样做之后,它现在可以正常工作了!

            【讨论】:

            • 将第二个参数设置为 TRUE 将打开调试,这违背了 prod 环境的目的。尝试运行 'app/console cache:clear --env=prod'。
            【解决方案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,如果我在其他任何地方运行它,它将作为生产运行。您显然可以添加任何您想要的检查,检查 staging/production/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"
                

                到 routing.yml

                对不起,我不知道如何很好地使用代码 sn-p 小部件, 但我希望我能帮到你。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-07-21
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-10-31
                  • 2022-06-12
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-09-25
                  相关资源
                  最近更新 更多