2013-07-31 3 views
0

Итак, я пытаюсь добавить контроллер 404, если изображение отсутствует, и мне нужно пойти и получить его.Symfony 2 404 Пользовательская страница для недостающего ресурса

Первоначально я попробовал прослушиватель NotFoundHttpException/ResourceNotFoundException, который загрузил класс, чтобы справиться с ним. Это отлично работает, если это проблема с маршрутизацией Symfony2.

Проблема в том, что это не так. Это файл /web/bundles/mysite/images/missingimage.jpg 404, который, как представляется, обрабатывается Apache.

Так с .htaccess я попробовал:

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ 
    RewriteRule ^(.*) - [E=BASE:%1] 

    RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
    RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L] 

    RewriteCond %{REQUEST_FILENAME} -f 
    RewriteRule .? - [L] 

    RewriteRule .? %{ENV:BASE}/app.php [L] 

    ErrorDocument 404 /web/404.txt 
</IfModule> 

Просто, чтобы увидеть, если я мог бы получить, чтобы работать, но я чувствую, что не будет и не было.

Итак, как я могу настроить свою настройку на страницу Symfony2, когда она встречает 404 в папке/web.

Я предполагаю, что это должно быть .htaccess, но я не очень хорошо смотрю.

В конце концов, я хочу, чтобы перейти к:

/web/app.php/FourZeroFourHandler/web/bundles/mysite/images/missingimage.jpg 

или:

/web/app_dev.php/FourZeroFourHandler/web/bundles/mysite/images/missingimage.jpg 

В зависимости от того, буду ли я в прод или разработчика.

И идеи?

+0

Вы видели: http://symfony.com/doc/current/cookbook/controller/error_pages.html # customizing-the-404-pages-and-other-error-pages – cheesemacfly

+0

К сожалению, Symfony 404 не бросается. Изображения находятся за пределами маршрутизации Symfony2, поэтому не генерирует исключение NotFoundHttpException. Он обходит Symfony 2 все вместе, и единственное, что знает о 404, - это Apache. Именно поэтому я пытаюсь заставить Apache перейти к определенному URL-адресу маршрутизации, если удалено 404. – Adi

ответ

0

У вас есть два варианта.

Первый - это маршрут всех изображений через приложение Symfony2. LiipImagineBundle делает это для создания эскизов. Как и вы, вы можете перенаправить все на свою страницу ошибок. Недостатком было бы то, что даже для статического изображения необходимо загрузить все ядро ​​Symfony2. Это время и ресурсы дороги.

Второй вариант является перенаправление с Apache2 на маршрут, который неизвестен или маршрут, который бросает 404/HttpNotFoundException:

/* 
* @Route('/404', name="not_found") 
*/ 
public function notFoundAction() 
{ 
    return new HttpNotFoundException(); 
} 

Это дает вам больше контроля над сообщением об ошибке, так как вы можете вынести twig template или зарегистрировать сообщение об ошибке.


Вы правы. У меня также были некоторые проблемы с пользовательским контроллером, когда я вставил ErrorDocument в мой .htaccess. Решение предназначено для редактирования вашего vhost. Перейдите на страницу /etc/apache2/sites-available и выберите файл (по умолчанию он называется default), где хранится ваш виртуальный хост. Замените опцию AllowOverride в <Directory>. И заменить его с этими линиями:

AllowOverride FileInfo 
    ErrorDocument 404 /not_found.html 

Решение было найдено here. Не забудьте перезагрузить конфигурацию apache:

sudo service apache2 reload 
+0

Я бы согласился на Apache просто перенаправить 404 на маршрут контроллера. На данный момент ErrorDocument 404, похоже, не работает. Осмотрев веб-сайты немного, у меня сложилось впечатление, что это не сработает для Symfony 2. – Adi

+0

Это действительно работает. В моем примере перенаправляется на '/ 404'. В вашем '.htacces' вам нужна эта запись:' ErrorDocument 404/404' – ferdynator

+0

Как я уже упоминал выше, у меня есть это в моем файле .htaccess ErrorDocument 404 /web/404.txt, который там существует файл 404.txt. Он не отображается, когда я пытаюсь получить доступ к изображению, которого там нет. В настоящее время это последняя строка внутри: IfModule mod_rewrite.c (у меня было это в моем оригинальном посте, но она была сидела в пределах < > и удалилась. Любые предложения относительно того, почему она может не работать? – Adi

Смежные вопросы