由silep返回的404状态代码不会被.htaccess重定向

时间:2016-07-16 23:01:20

标签: .htaccess silex

当我手动输入错误的网址时,我的.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;

由于

2 个答案:

答案 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不存在。