2012-05-03 7 views
21

Nel mio progetto Symfony2 sono in modalità sviluppo la corretta schermata 404 Eccezione. Ma sto ottenendo schermo vuoto con codice di stato HTTP 500 invece di 404 in modalità di produzione. Utilizzo modelli di errore personalizzati situati in app/Resources/TwigBundle/views/Exception. In errore apache log crea questo messaggio: Errore 500 Symfony2 invece di 404 in produzione

PHP Fatal error: Uncaught exception 'Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException' in /home/test/app/cache/prod/appprodUrlMatcher.php:518\nStack trace: 
#0 /home/test/app/cache/prod/classes.php(1025): appprodUrlMatcher->match('/404') 
#1 /home/test/app/cache/prod/classes.php(4550): Symfony\\Component\\Routing\\Router->match('/404') 
#2 [internal function]: Symfony\\Bundle\\FrameworkBundle\\EventListener\\RouterListener->onKernelRequest(Object(Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent)) 
#3 /home/test/app/cache/prod/classes.php(3777): call_user_func(Array, Object(Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent)) 
#4 /home/test/app/cache/prod/classes.php(3703): Symfony\\Component\\EventDispatcher\\EventDispatcher->doDispatch(Array, 'kernel.request', Object(Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent)) 
#5 /home/test/app/cache/prod/classes.php(4787): Symfony\\Component\\EventDispatcher\\EventDispatcher->dispatch('kernel.request', Object(Symfony\\Component\\HttpKernel\\Event\\Get in /home/test/app/cache/prod/classes.php on line 4560 
+0

Ho riscontrato un problema simile. Come hai risolto questo? –

risposta

13

Symfony\Component\Routing\Exception\ResourceNotFoundException significa nome della rotta non definito. Sembra che tu abbia da qualche parte nel tuo modello di errore {{ path('wrong_route') }}.

+4

Ho qualcosa di simile in corso, ma è causato da 'is_granted ('IS_AUTHENTICATED_FULLY')' - e solo per la mia pagina 404, la mia pagina 403 viene caricata correttamente. Qualche idea su questo? [link] (http://stackoverflow.com/questions/11869921/symfony2-is-grantedis-authenticated-fully-during-404-error-page-display-cau) – Nick

+0

@Routy hai ottenuto [la risposta] (https://github.com/symfony/symfony/issues/5225#issuecomment-7626407) ma ho dimenticato di menzionarlo qui :) – coviex

1

Un'altra opzione è che si sta tentando di accedere al token di sicurezza nel contesto di sicurezza quando nessun token è disponibile.

4

ResourceNotFoundException è ciò che il router lancia quando nessuna rotta corrisponde alla richiesta corrente.

Questo può essere un problema di cache (80% delle volte, è la cache. Prova rm -rf app/cache/* sul server di pre-produzione). Poiché il problema non viene visualizzato localmente ... (hai provato il "prod" env localmente a destra?).

Si dovrebbe anche cercare di rimuovere tutto dal vostro app/Resources/TwigBundle/views/Exception/error404.html.twig (è che il nome del file che si utilizza?) tranne semplice HTML, per verificare se non è un problema di ramoscello.

+1

Thx un sacco ... Ho trascorso 1 giorni con lo stesso numero (500 anziché 404) e era l'app/cache /. – nolazybits

0

forse app/Resources/TwigBundle/views/Exception/riferimenti error.html.twig un'altra base-layout di modello che non esiste - questo è stato il problema nel mio caso

1

ecco come lo reindirizzare tutti percorsi inesistenti al percorso principale. Inserisci questa voce di rotta nella parte inferiore della configurazione del routing. Tutto il percorso esistente DEVE essere sopra di esso!

anything: 
    path:  /{path} 
    defaults: 
     _controller: FrameworkBundle:Redirect:urlRedirect 
     path:/
     permanent: true 
    requirements: 
     path: ".+" 

di riferimento:
http://symfony.com/doc/current/cookbook/routing/slash_in_parameter.html
http://symfony.com/doc/current/cookbook/routing/redirect_in_config.html

+0

Deve esserci qualcosa di sbagliato in SO. Ricordo questa risposta, ma sicuramente non per questa domanda! – ihsan

9

La ragione più probabile che stai ricevendo una pagina di errore 500/vuoto sulla produzione (app.php), anche quando avete definito una pagina di errore personalizzata (ad esempio app /Resources/TwigBundle/views/Exception/error404.html.twig) è che il modello di errore viene chiamata la funzione ramoscello is_granted, senza controllare se l'utente è connesso

passaggi per eseguire il debug:.

1) Controlla app/log/prod.log. Vedi un errore come questo?

request.ERROR: Exception thrown when handling an exception (Twig_Error_Runtime: An exception has been thrown during the rendering of a template ("The security context contains no authentication token. One possible reason may be that there is no firewall configured for this URL.") 

2) Se viene visualizzato l'errore di cui sopra, vedere se è possibile trovare un riferimento per is_granted nel modello di errore. Verifica che l'utente abbia effettuato l'accesso prima di chiamare is_granted. Es .:

{% if app.user is not null and is_granted('ROLE_ADMIN') %} 
<p>Text goes here</p> 
{% else %} 

3) Se non è possibile trovare un riferimento per is_granted nel modello, vedere se c'è una chiamata a knp_menu_render(), che viene utilizzato dal menu fascio KNP.Controlla anche qualsiasi modello esteso. Avvolgere la chiamata a knp_menu_render in un controllo per verificare che l'utente è connesso:

{% if app.user %} 
    {{ knp_menu_render() }} 
{% endif %} 

Per ulteriori informazioni, consultare il commento di tessuto alla fine di questa pagina: https://github.com/symfony/symfony/issues/5320

4

Nel mio caso era l'uso del tag {% stylesheets%} in un modello 404, mentre TwigBundle non era incluso nella configurazione di Assetic.

Controlla il tuo app/logs/prod.log, dovrebbe avere una risposta.

0

Solo una nota complementare alle risposte fornite: Il ResourceNotFoundException può anche essere lanciato se si sta tentando di includere un modello inesistente. Un caso tipico è che hai rifattorizzato il codice dell'applicazione ma hai dimenticato di aggiornare le pagine di errore perché si trovano in app/Resources e non nella tua cartella src/ o includendo un determinato modello che utilizza una variabile o un servizio che non è definito nell'errore " contesto.

2

Ho avuto lo stesso problema,

Ma il mio era isGranted nel fianco php. Così ho aggiunto un controllo di token:

Prima:

if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY') 

Dopo:

if ($this->get('security.token_storage')->getToken() && $this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY') 
0

ho encounteres che Symofny 3 genera un errore 500 in produzione, quando non si utilizza

$this->createNotFoundException() 

nel controller.

throw Exception('message', 404) 

opere in dev-ambiente, ma non sulla produzione.

Problemi correlati