2012-05-03 22 views
21

En mi proyecto de Symfony2 estoy obteniendo el modo de desarrollo correcto 404 Pantalla de excepción. Pero obtengo una pantalla en blanco con el código de estado HTTP 500 en lugar de 404 en el modo de producción. Estoy usando plantillas de error personalizadas ubicadas en app/Resources/TwigBundle/views/Exception. En el error de registro de Apache que crea este mensaje: Error de Symfony2 500 en lugar de 404 en la producción

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

He encontrado un problema similar. Como resolviste esto? –

Respuesta

13

Symfony\Component\Routing\Exception\ResourceNotFoundException significa nombre de la ruta definida. Parece que tienes un lugar en tu plantilla de error {{ path('wrong_route') }}.

+4

Tengo algo similar sucediendo, pero está siendo causado por 'is_granted ('IS_AUTHENTICATED_FULLY')' - y solo para mi página 404, mi página de 403 se carga muy bien. ¿Alguna idea sobre eso? [link] (http://stackoverflow.com/questions/11869921/symfony2-is-grantedis-authenticated-fully-during-404-error-page-display-cau) – Nick

+0

@Routy tienes [la respuesta] (https://github.com/symfony/symfony/issues/5225#issuecomment-7626407) pero se olvidó de mencionarlo aquí :) – coviex

1

Otra opción es que está intentando acceder al token de seguridad en el contexto de seguridad cuando no hay un token disponible.

4

ResourceNotFoundException es lo que lanza el enrutador cuando ninguna ruta coincide con la solicitud actual.

Esto puede ser un problema de caché (80% del tiempo, es la caché. Pruebe rm -rf app/cache/* en su servidor de preproducción). Como el problema no aparece localmente ... (has probado el envio "prod" localmente ¿no?).

También debe tratar de eliminar todo, desde su app/Resources/TwigBundle/views/Exception/error404.html.twig (es que el nombre de archivo que utiliza?), excepto HTML simple, para comprobar si no es una cuestión ramita.

+1

Thx mucho ... Pasé 1 días con el mismo problema (500 en lugar de 404) y era la aplicación/caché /. – nolazybits

0

quizá app/Resources/TwigBundle/views/Excepción/referencias error.html.twig otra base-layout-plantilla que no existe - este era el problema en mi caso

1

Aquí es cómo redirigir todas las rutas no existentes a la ruta raíz Ponga esta entrada de ruta en la parte inferior de su configuración de enrutamiento. ¡Toda la ruta existente DEBE estar encima de ella!

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

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

+0

Debe haber algo mal con SO. Recuerdo esta respuesta, ¡pero definitivamente no para esta pregunta! – ihsan

9

La razón más probable de que está recibiendo una página de error 500/blanco en la producción (app.php), aun cuando se haya definido una página personalizada de error (por ejemplo, aplicación /Resources/TwigBundle/views/Exception/error404.html.twig) es que su plantilla de error está llamando a la función ramita is_granted, sin comprobar si el usuario se registra en

Pasos para depuración:.

1) Compruebe la aplicación/logs/prod.log. ¿Ves un error como este?

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) Si aparece el error mencionado anteriormente, ver si se puede encontrar una referencia a is_granted en su plantilla de error. Verifique que el usuario haya iniciado sesión antes de llamar a is_granted. Ej .:

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

3) Si no puede encontrar una referencia a is_granted en su plantilla, a ver si hay una llamada a knp_menu_render(), que es utilizado por el paquete menú PNK.Compruebe en cualquier plantilla extendida también. Envolver la llamada a knp_menu_render en una comprobación para verificar que el usuario se registra en:

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

Para obtener más información, consulte el comentario de fabric al final de esta página: https://github.com/symfony/symfony/issues/5320

4

En mi caso fue el uso de la etiqueta {% stylesheets%} en una plantilla 404, mientras que TwigBundle no se incluyó en la configuración de Assetic.

Compruebe su app/logs/prod.log, debería tener una respuesta.

0

Solo una nota complementaria a las respuestas dadas: ResourceNotFoundException también se puede lanzar si está tratando de incluir una plantilla inexistente. Un caso típico es que refactivó el código de la aplicación, pero olvidó actualizar sus páginas de error, ya que están ubicadas en app/Resources y no en su carpeta src/ o incluyen una plantilla determinada que utiliza una variable o servicio que no está definido en el "error". "contexto".

2

que tenían el mismo problema,

Pero mi isGranted estaba en el lado php. Por lo que añade un cheque token:

Antes:

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

Después:

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

I encounteres que Symofny 3 emite un error 500 en la producción cuando no se utiliza

$this->createNotFoundException() 

en su controlador.

throw Exception('message', 404) 

trabaja en dev-enviroment, pero no en la producción.

Cuestiones relacionadas