[英]Why is my Symfony2 install 404ing when I access app.php?
在Symfony2中,當通過app_dev.php在本地訪問我的應用程序時,一切正常。 但是,當我訪問app.php時它是404s:
哎呀! 發生錯誤
服務器返回“404 Not Found”。
有些東西壞了。 請發送電子郵件至[email],告訴我們發生此錯誤時您在做什么。 我們會盡快修復它。 對於某事很抱歉
新的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();
}
(+是你應該添加的行, - 是你應該刪除的行)
我有同樣的問題,我只是清除了緩存。 php app/console cache:clear --env=prod
這解決了我的問題。
不要將該屬性設置為true: $ kernel = new AppKernel ('prod', TRUE);
它將激活調試模式,不建議用於prod。
這是正常的Symfony緩存工作。 您所做的任何更改都將在app_dev.php(開發環境)中查看/測試,但不會在app.php(生產環境)中進行,因為它會緩存所有內容。
我遵循一個有效的簡單規則。 每次我更新app\\config\\routing.yml
任何內容(或任何真正的更改),我想在生產中看到它,你必須通過運行以下控制台命令清除CACHE :
Symfony 2. *: php app/console cache:clear --env=prod
Symfony 3. *: php bin/console cache:clear --env=prod
現在嘗試在瀏覽器上重新加載頁面,您將看到它的工作原理。
有同樣的問題 。
實際上可能有幾個問題。 但是您必須使用console命令清除緩存,因為symfony緩存路由,模板和配置。
好的,我遇到了同樣的問題,清除緩存沒有解決它。 經過一個小時的閱讀帖子,每個人都說“清除緩存”,我決定真正了解最新情況。 所以我會嘗試向像我這樣的人(剛剛開始)解釋。 希望我沒錯,如果是的話,請糾正我。
我假設您正在閱讀本書的教程,其中包含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]
有效。 它應該是。
我希望這能幫助像我這樣的人,理解一些基礎知識。
我必須同意安德魯。
將第二個AppKernel轉為TRUE只允許更清晰的調試消息(您可能會注意到應用程序並不比預期的快)。
就我而言,它告訴我沒有可用於生產的_wecome路線(即routing.yml)。
我不得不添加Misbah提到的以下行,並按照其他常用程序使我的應用程序全速運行。
_welcome: pattern: / defaults: { _controller: AcmeDemoBundle:Welcome:index }
當你按照安東的回答,仍然得到錯誤,你可以嘗試以下方式
在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
看起來您沒有正確設置路由。
檢查您的routing.yml
文件是否包含/
的默認路由。 如果沒有,請在要運行的控制器/操作中添加一個。
好吧,我找到了一個更簡單,更快的答案:
第一個: $kernel = new AppKernel('prod', TRUE);
在app.php文件上。
然后,在您的routing.yml(app / config / routing one,而不是您的bundle)上,只需在聲明路由后刪除默認生成的代碼。
_demo: resource: "@AcmeDemoBundle/Controller/DemoController.php"
type: annotation
prefix: /demo
必須刪除。 這樣做之后,它現在正在沒有問題!
將您的環境更改為developmet,以使用在routes_dev.yml中配置的路由
$ kernel = new AppKernel('dev',true);
免責聲明:我對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,如果我在其他地方運行它將作為生產運行。 您顯然可以添加所需的任何檢查,檢查登台/生產/開發文件路徑而不是主機名。
這個問題困擾我很多,這是我的解決方案:首先更改文件行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
對不起,我不知道如何使用代碼片段小部件,但我希望我可以幫助你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.