2012-05-03 37 views
21

Trong dự án Symfony2 của tôi, tôi đang ở chế độ phát triển chính xác Màn hình ngoại lệ 404. Nhưng tôi nhận được màn hình trống với mã trạng thái HTTP 500 thay vì 404 ở chế độ sản xuất. Tôi đang sử dụng các mẫu lỗi tùy chỉnh nằm trong app/Resources/TwigBundle/views/Exception. Do lỗi apache log nó tạo ra thông điệp này: Lỗi Symfony2 500 thay vì 404 khi sản xuất

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

Tôi đã gặp sự cố tương tự. Làm thế nào bạn giải quyết điều này? –

Trả lời

13

Symfony\Component\Routing\Exception\ResourceNotFoundException nghĩa tên đường không xác định. Có vẻ như bạn đã ở đâu đó trong mẫu lỗi của mình {{ path('wrong_route') }}.

+4

Tôi có một cái gì đó tương tự đang xảy ra, nhưng nó đang được gây ra bởi 'is_granted ('IS_AUTHENTICATED_FULLY')' - và chỉ cho trang 404 của tôi, trang 403 của tôi tải tốt. Bất kỳ thông tin chi tiết nào về điều đó? [link] (http://stackoverflow.com/questions/11869921/symfony2-is-grantedis-authenticated-fully-during-404-error-page-display-cau) – Nick

+0

@Routy bạn có [câu trả lời] (https://github.com/symfony/symfony/issues/5225#issuecomment-7626407) nhưng quên đề cập đến nó ở đây :) – coviex

1

Tùy chọn khác là bạn đang cố truy cập mã thông báo bảo mật trong ngữ cảnh bảo mật khi không có mã thông báo nào.

4

ResourceNotFoundException là những gì bộ định tuyến sẽ ném khi không có tuyến đường khớp với yêu cầu hiện tại.

Đây có thể là sự cố bộ nhớ cache (80% thời gian, đó là bộ nhớ cache. Hãy thử rm -rf app/cache/* trên máy chủ tiền sản xuất của bạn). Vì vấn đề không xuất hiện tại địa phương ... (bạn đã thử dùng "prod" env tại địa phương phải không?).

Bạn cũng nên cố gắng xóa mọi thứ khỏi app/Resources/TwigBundle/views/Exception/error404.html.twig (là tên tệp bạn sử dụng?) trừ HTML đơn giản, để kiểm tra xem đó có phải là vấn đề không.

+1

Thx rất nhiều ... Đã dành 1 ngày với cùng một vấn đề (500 thay vì 404) và nó là ứng dụng/cache /. – nolazybits

0

lẽ app/Resources/TwigBundle/views/ngoại lệ/tài liệu tham khảo error.html.twig khác cơ sở bố trí-mẫu mà không tồn tại - đây là vấn đề trong trường hợp của tôi

1

Dưới đây là làm thế nào tôi chuyển hướng tất cả các tuyến đường không tồn tại đến đường dẫn gốc. Đặt mục nhập tuyến đường này ở cuối cấu hình định tuyến của bạn. Tất cả các tuyến đường hiện có PHẢI được ưu tiên!

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

tham khảo:
http://symfony.com/doc/current/cookbook/routing/slash_in_parameter.html
http://symfony.com/doc/current/cookbook/routing/redirect_in_config.html

+0

Phải có điều gì đó sai với SO. Tôi nhớ câu trả lời này, nhưng chắc chắn không phải cho câu hỏi này! – ihsan

9

Lý do rất có thể bạn đang nhận được 500 lỗi/trang trống trên sản xuất (app.php), ngay cả khi bạn đã xác định một trang lỗi tùy chỉnh (ví dụ ứng dụng /Resources/TwigBundle/views/Exception/error404.html.twig) là mẫu lỗi của bạn được gọi hàm cành lá is_granted, mà không kiểm tra nếu người dùng đang đăng nhập

bước để gỡ lỗi:.

1) Kiểm tra ứng dụng/nhật ký/prod.log. Bạn có thấy lỗi như thế này không?

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) Nếu bạn thấy lỗi được đề cập ở trên, hãy xem liệu bạn có thể tìm thấy tham chiếu đến is_granted trong mẫu lỗi của mình không. Kiểm tra xem người dùng đã đăng nhập chưa trước khi gọi is_granted. Ví dụ .:

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

3) Nếu bạn không thể tìm thấy một tài liệu tham khảo để is_granted trong mẫu của bạn, nhìn thấy nếu có một cuộc gọi đến knp_menu_render(), được sử dụng bởi các bó đơn KNP.Kiểm tra trong bất kỳ mẫu mở rộng là tốt. Quấn cuộc gọi đến knp_menu_render trong một kiểm tra để xác minh rằng người dùng sẽ được đăng nhập:

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

Để biết thêm thông tin, hãy bình luận bằng stof ở phần cuối của trang này: https://github.com/symfony/symfony/issues/5320

4

Trong trường hợp của tôi nó đã sử dụng thẻ {% stylesheets%} trong mẫu 404, trong khi TwigBundle không được bao gồm trong cấu hình Assetic.

Kiểm tra app/logs/prod.log của bạn, cần có câu trả lời.

0

Chỉ cần một lưu ý bổ sung cho các câu trả lời đã cho: ResourceNotFoundException cũng có thể được ném nếu bạn đang cố gắng bao gồm một mẫu không tồn tại. Một trường hợp điển hình là bạn đã tái cấu trúc mã ứng dụng của mình nhưng bạn quên cập nhật các trang lỗi của mình khi chúng nằm trong app/Resources và không nằm trong thư mục src/ hoặc bao gồm mẫu đã cho sử dụng biến hoặc dịch vụ không được xác định trong lỗi " " bối cảnh.

2

Tôi gặp vấn đề tương tự,

Nhưng số isGranted của tôi là ở phía php. Vì vậy, tôi đã thêm một tấm séc mã thông báo:

Trước:

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

Sau:

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

tôi encounteres rằng Symofny 3 ném một lỗi 500 trong sản xuất khi bạn không sử dụng

$this->createNotFoundException() 

trong Bộ điều khiển của bạn.

throw Exception('message', 404) 

hoạt động trên môi trường phát triển, nhưng không hoạt động.

Các vấn đề liên quan