当我手动输入错误的网址时,我的.htaccess工作正常,重定向到我的自定义404页面。这是我的.htaccess(这是洞内容(没有其他重定向)):
RewriteEngine on
ErrorDocument 404 http://codeexample.local/404.shtml
现在,在我的基于Silex的应用程序中,如果客户端尝试编辑不存在的客户端,则返回404状态代码。即使状态代码确实是404,我可以看到curl -v。但由于某种原因,它没有被重定向到404错误页面。
以下是我访问网址的方式:
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方法中我正在检查客户端是否存在于数据库中,所以我正在返回这样的响应:
$response = new Response(
'',
Response::HTTP_NOT_FOUND,
array('content-type' => 'text/html')
);
$response->prepare($request);
$response->send();
return $response;
由于
答案 0 :(得分:0)
您应该重定向到错误页面。
$app->redirect( '/404.shtml' );
在您的代码中,您正在使用状态代码创建新的响应。对于apacheserver来说,这已经太晚了。 而其他想法是调用创建errorpage的函数,但我会说不要这样做以保持代码清洁。
答案 1 :(得分:-1)
你的期望可能有点偏差。 Web服务器将处理对404响应不知道的地址的请求,您还可以为其提供一些HTML以及404响应。但是404响应才是真正重要的一点。
告诉Web服务器404.shtml是要发送回浏览器的标记,就像重定向到该页面一样,它只是将该文件的内容用于HTML发回404回复。
Silex对此一无所知,因为在Silex接近请求的时候,Web服务器的404处理时间很长。当Silex结束时出现404条件时,您需要做两件事:在响应中返回404代码(您现在正在执行此操作),并且您也可以选择发回一些内容(如404中的标记) .shtml文件)。如果您希望与Web服务器使用的404.shtml具有相同的404标记...请阅读该文件并将其作为404响应的内容返回。
您可以尝试使用不同的路径并重新调整Web服务器404以返回Silex路由URL的结果,然后在内部使用相同的路由来获取Silex的404内容,但我认为这是错误的Web服务器的方法是窃听PHP / Silex以响应已经被识别为无效的请求。
你真正做的不想要做的是从Silex重定向到包含404标记的文档。这样做会告诉用户代理它尝试的URL是不正确的,它应该尝试另一个(由重定向标题提供),然后将在标记中向人类返回404消息,但将向用户代理返回200-OK 。因此,当用户代理浏览到/someBadPage.html时,您会告诉他们该URL的正确文档是/404.html。并不是说/someBadPage.html不存在。