由silex返回的404状态代码未被.htaccess重定向

由silex返回的404状态代码未被.htaccess重定向,.htaccess,silex,.htaccess,Silex,当我手动键入错误的url并将其重定向到自定义404页面时,my.htaccess工作正常。这是我的.htaccess此孔内容没有其他重定向: RewriteEngine on ErrorDocument 404 http://codeexample.local/404.shtml 现在,在基于Silex的应用程序中,如果客户端试图编辑不存在的客户端,我将返回404状态代码。尽管状态代码实际上是404,正如我在curl-v中看到的那样。但由于某些原因,它并没有重定向到404错误页面 $app-&

当我手动键入错误的url并将其重定向到自定义404页面时,my.htaccess工作正常。这是我的.htaccess此孔内容没有其他重定向:

RewriteEngine on
ErrorDocument 404 http://codeexample.local/404.shtml
现在,在基于Silex的应用程序中,如果客户端试图编辑不存在的客户端,我将返回404状态代码。尽管状态代码实际上是404,正如我在curl-v中看到的那样。但由于某些原因,它并没有重定向到404错误页面

$app->redirect( '/404.shtml' );
以下是我访问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方法中,我正在检查数据库中是否存在客户端,同时返回如下响应:

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

return $response;

谢谢

您应该重定向到错误页面

$app->redirect( '/404.shtml' );
在代码中,您正在使用状态代码创建新响应。这对于apacheserver来说太晚了,无法做出反应。
另一个想法是调用创建errorpage的函数,但我要说的是,不要这样做以保持代码干净

你的期望可能有点偏离了。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不正确,它应该尝试重定向头提供的另一个URL,然后重定向头将向标记中的人返回404消息,但将向用户代理返回200-OK。因此,实际上,当用户代理浏览到/someBadPage.html时,您会告诉他们该URL的正确文档是/404.html。并不是说/someBadPage.html不存在。

如果不想重定向到404页面,则需要404他们浏览到的页面。这个练习的目的并不是简单地返回一个表示我们没有该页面的视图,而是告诉浏览器,更重要的是告诉搜索引擎,请求的URL不可用。不是说我想你指的是这个页面,这就是重定向的意思。为没有解释的否决票欢呼。这确实有助于社区。干得好。干得好。