【问题标题】:Symfony2 dev environment works, prod environment gives 404 errorSymfony2 开发环境工作,生产环境给出 404 错误
【发布时间】:2012-08-05 10:36:35
【问题描述】:

我最近在我的机器上成功安装了 Symfony2。

我可以访问http:/localhost/app_dev.php(开发环境)

但是,当我尝试访问 prod 环境时:

http:/localhost/app.php

我在浏览器中收到以下错误消息:

糟糕!发生错误

服务器返回“404 Not Found”。 东西坏了。请在 [email] 给我们发电子邮件,让我们知道什么 发生此错误时您正在做的事情。我们会尽快修复 可能的。给您带来的不便,我们深表歉意。

我已经检查了明显的:文件 app.php 确实存在于与 app_dev.php 相同的文件夹中 - 所以我不知道是什么原因造成的。

有没有人可以解决这个问题?

[[编辑]]

我已按照建议键入:sudo php app/console cache:clear env=prod no-debug 清除了缓存。我现在得到一个空白屏幕。令人担忧的是,app/logs/prod.log 中没有记录任何错误消息,所以我对出了什么问题一无所知(prod 环境仍然可以正常工作)。

我的 app/config/routing.yml 文件的内容:

### fos routing, remove later
fos_user_security:
    resource: "@FOSUserBundle/Resources/config/routing/security.xml"

fos_user_profile:
    resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
    prefix: /profile

fos_user_register:
    resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
    prefix: /register

fos_user_resetting:
    resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
    prefix: /resetting

fos_user_change_password:
    resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
    prefix: /profile

###


# Internal routing configuration to handle ESI
#_internal:
#   resource: "@FrameworkBundle/Resources/config/routing/internal.xml"
#   prefix:   /_internal

这是我的 app/config/routing_dev.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_prod.yml**

(警钟响起)- Symfony2 不附带生产路由配置文件吗?

我的Apache配置文件内容如下图:

NameVirtualHost *:80

<VirtualHost *:80>
    DocumentRoot /path/to/symfony/web
    ServerName localhost

    # Custom log file
    Loglevel warn
    ErrorLog  /path/localhost.error.log
    CustomLog /path/localhost.access.log combined

    <Directory /path/to/symfony/web>
        AllowOverride None
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f 
        RewriteRule ^(.*)$ app.php [QSA,L]
    </Directory>
</VirtualHost>

[[更多详情]]

app/logs/prod.log 的内容

[2012-08-10 18:10:38] security.INFO:填充的 SecurityContext 带有 匿名令牌 [] [] [2012-08-10 18:10:38] 请求。错误: Symfony\Component\HttpKernel\Exception\NotFoundHttpException: 没有路由 在“GET /”(未捕获的异常)中找到 /path/to/symfony/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/EventListener/RouterListener.php 第 83 行 [] []

【问题讨论】:

  • 你能粘贴你的app/config/routing.yml吗?
  • 还有routing_dev.ymlrouting_prod.yml。我还认为您应该检查您的网络服务器的access.logerror.log。另外,请附上您的网络服务器虚拟主机配置。
  • 没有routing_prod.yml也没关系。这意味着它将选择routing.yml
  • 您也可以尝试手动删除缓存目录 (rm -rf app/cache/*) 并运行 app/console router:debug 以查看已注册的确切路由。
  • 我遇到了同样的问题,现在我在空白页面,没有像你这样的错误,那么你找到解决方案了吗?

标签: php symfony


【解决方案1】:

你是否开启了生产环境并清除了缓存? 运行控制台并执行以下操作:

app/console --env=prod cache:clear

【讨论】:

  • 如果您使用symfony 生成项目,您可以尝试使用bin/console 而不是app/console
  • 建议直接手动删除缓存目录:(在symfony项目目录时)$ rm -rf app/cache
【解决方案2】:

我想我也有类似的问题。我相信预热缓存可以解决我的实例。

php app/console cache:warmup --env=prod --no-debug

【讨论】:

  • +1 这帮助我解决了那些烦人的开发工作,刺激 WSOD 情况。
【解决方案3】:

最近安装了 Symfony 2.2 我也遇到了这个问题,但这实际上是正常行为。开箱即用的含义 Symfony 2.x(在撰写本文时)不附带任何路由/内容 生产环境。

在您的情况下,您似乎安装了 Friends of Symfony 捆绑包,它确实在您的生产路线 (routing.yml) 中设置了一些路线,但乍一看似乎没有一条路线针对您的生产环境的根目录,即http:/localhost/app.php/ 所以 404 可能是预期的。我不能完全确定,因为它正在导入路线,所以细节被掩盖了。检查您的路线的一个好方法是阅读Visualizing & Debugging Routes,在那里您可以了解app/console router:debug CLI 命令。

routing.yml 是生产环境中路由的默认位置(意味着routing_prod.yml 不是一个东西)。你会注意到routing_dev.yml 导入了routing.yml。这意味着您投入生产的所有东西(开箱即用)在开发中都是可访问的。您看到的演示内容是开发环境独有的,这就是您在生产中看不到它的原因。随意移动一些东西以满足您的需求,但开发人员导入产品通常是一个好主意,反之亦然。

任何时候您想测试生产中的更改,都需要按照@tolgap 的建议清除缓存。生产环境严重依赖预编译缓存,因此该命令将强制您的生产缓存刷新。开发环境总是在刷新它的缓存。理解这一点对于使用 Symfony 至关重要。尽管 Symfony.org 上的 Book 是一个很好的切入点,但它并没有完全说明缓存和工作流程的字幕这一点。在我意识到routing.ymlrouting_dev.yml 之间的关系以及开发的软缓存与生产的硬缓存之间的关系之前,我确实感到困惑了一分钟。

【讨论】:

    【解决方案4】:

    我尝试了@gilden 在他的评论中给出的解决方案;它有效。

    我跑的是php bin/console cache:clear --env=prod,而不是rm -rf app/cache/*

    【讨论】:

      【解决方案5】:

      我很惊讶没有人告诉你: 您在 prod 环境中没有路径。

      把这个写在 app/config/routing.yml

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

      【讨论】:

        【解决方案6】:

        您需要为您的本地服务器安装 APC,一切都将在 prod mod 中为您工作。 还要尝试在 parameters.yml 中找到正确的数据库,因为 dev 正在添加 DATABASENAME_dev。

        【讨论】:

          【解决方案7】:

          今天我遇到了同样的问题并尝试了各种解决方案。直到我想起启用 mod_rewrite apache 服务很重要。为此,请运行以下命令(在 Ubuntu 上)

          sudo a2enmod rewrite
          

          然后重启服务器

          sudo service apache2 restart
          

          我希望有人可以提供帮助。 问候!

          【讨论】:

          • 我在使用 docker php7.0-apache 镜像时发生了这种情况!谢谢!
          【解决方案8】:

          我的 symfony 缓存文件夹不可写。当我将缓存完整目录及其文件设置为可写时,它就起作用了。

          sudo chmod -R 777 .
          

          【讨论】:

            【解决方案9】:

            (Agrega esto dentro del archivo routing_dev.yml) 在routing_dev.yml中添加这个

            _wellcome:
                pattern: /
                defaults: { _controller:AppBundle:Default:index }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-02-14
              • 2014-05-07
              • 2018-06-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多