2016-07-16 2 views
1

. My .htaccess отлично работает при вводе вручную неправильного URL-адреса, который перенаправляется на мою пользовательскую страницу 404. Вот мой .htaccess (это содержание отверстия (нет других перенаправлений)):404 Код состояния, возвращаемый silex, не перенаправляется .htaccess

RewriteEngine on 
ErrorDocument 404 http://codeexample.local/404.shtml 

Теперь в моем приложении на основе Silex я возвращал код статуса 404, если клиент пытается изменить несуществующий клиент. Хотя код статуса действительно 404, как я вижу с curl -v. Но по какой-то причине он не перенаправляется на страницу ошибок 404.

Вот как я получить доступ к URL:

http://codeexample.local/index.php/2/edit 

Вот мой index.php редактировать маршрут раздела:

$app->match('/{id}/edit', function (Request $request, $id) use ($app) { 
    try { 
     $clientController = new ClientController($request, $id); 
     return $clientController->editAction($app); 
    } 
    catch(\Exception $e){ 
     return $e->getMessage(); 
    } 
}) 
->assert('id', '\d+') 
->method('GET|POST'); 

в моем методе editAction я проверяю, если клиент существует в базе данных otherwhise Я возвращаю ответ так:

$response = new Response(
     '', 
     Response::HTTP_NOT_FOUND, 
     array('content-type' => 'text/html') 
     ); 
$response->prepare($request); 
$response->send(); 

return $response; 

Благодаря

ответ

-1

Ваши ожидания здесь немного, возможно. Веб-сервер будет обрабатывать запросы для адресов, о которых он не знает с ответом 404, и вы также можете предоставить ему HTML-код для отправки вместе с ответом 404. Но это 404 ответ, который действительно является важным битом.

указал веб-сервер, который 404.shtml является наценка отправить обратно в браузер не как перенаправления на эту страницу, он просто использует содержимое этого файла для HTML, чтобы отправить обратно с 404.

Silex ничего не знает об этом, так как обработка 404 веб-сервера уже давно выпала из-под изображения к тому времени, когда Silex попадает в любую точку запроса. Когда в конце Silex есть условие 404, вам нужно сделать две вещи: вернуть код 404 в ответ (вы делаете это сейчас), и вы можете дополнительно отправить некоторый контент обратно (например, разметка в 404 .shtml). Если вы хотите иметь ту же самую отметку 404, что и файл 404.shtml, который использует веб-сервер ... прочитайте этот файл и верните его в качестве содержимого с ответом 404.

Вы можете попробовать пойти по другому маршруту и ​​переустановить свой веб-сервер 404, чтобы вернуть результат URL-адреса, перенаправленного в Silex, а затем использовать тот же самый маршрут для содержимого 404 из Silex тоже, но я думаю, что это неправильный подход для веб-сервера для подслушивания PHP/Silex для ответа на запрос, который уже был признан недействительным.

Что вы на самом деле действительно не хочу сделать перенаправление с Silex на документ, содержащий наценку для 404. Что это будет сделать, это сказать агенту пользователя, что URL он попытался было неправильным, и он должен попробуйте еще один (как предусмотрено заголовком перенаправления), который затем вернет сообщение 404 человеку в разметке, но будет возвращать 200-OK пользовательскому агенту. Таким образом, когда пользовательский агент просматривает/someBadPage.html, вы должны сообщить им правильный документ для этого URL-адреса /404.html. Не то, чтобы /someBadPage.html не существует.

+0

Приветствия для голосования без объяснений. Это действительно помогает сообществу. Хорошая работа. Молодцы * ты *. –

0

необходимо перенаправить на страницу с ошибкой.

$app->redirect('/404.shtml'); 

В вашем коде вы создаете новый ответ со статусом. Слишком поздно для апакер-сервера реагировать. И другая идея - вызвать функцию, которая создает ошибку, но я бы сказал, не делайте этого, чтобы сохранить код чистым.

+2

Вы не хотите перенаправлять страницу 404, вы хотите просмотреть страницу, на которую они просматривали. Объектом упражнения является не просто возвращение представления, в котором говорится: «У нас нет этой страницы», вы хотите сообщить браузеру * (и, что более важно, поисковые системы), что * URL-адрес, который был запрошен *, недоступен. Не ответ, который говорит: «Я думаю, что вы имели в виду эту страницу», что и означает перенаправление. –

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