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

404 status code returned by silex is not redirected by .htaccess

我的 .htaccess 在我手动输入错误时工作正常 url 它重定向到我的自定义 404 页面。这是我的 .htaccess(这是漏洞内容(没有其他重定向)):

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

现在,在我基于 Silex 的应用程序中,如果客户端试图编辑一个不存在的客户端,我会 return 一个 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 方法中,我正在检查客户端是否存在于数据库中,否则我会 return 做出这样的响应:

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

return $response;

谢谢

您应该重定向到错误页面。

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

在您的代码中,您正在创建一个带有状态代码的新响应。这对 apache 服务器来说来不及反应了。 另一个想法是调用创建错误页面的函数,但我会说不要这样做以保持代码干净。

您的期望可能有点偏离这里。 Web 服务器将通过 404 响应处理对它不知道的地址的请求,您还可以向它提供一些 HTML 以与 404 响应一起发送。但真正重要的是 404 响应。

告诉 Web 服务器 404.shtml 是要发送回浏览器的 mark-up 不像 重定向 到那个页面,它只是使用HTML 随 404 响应发回的文件内容。

Silex 对此一无所知,因为当 Silex 接近请求时,Web 服务器的 404 处理早已被排除在外。当 Silex 端出现 404 条件时,您需要做两件事:return 响应中的 404 代码(您现在正在这样做),并且您也可以选择发回一些内容(例如404.shtml 文件中的标记)。如果你想拥有与网络服务器使用的 404.shtml 相同的 404 mark-up...读取该文件并将其 return 作为你的 404 响应的内容。

您可以尝试走一条不同的路线,将您的网络服务器 404 重新调整为 return Silex-routed URL 的结果,然后在内部对内容使用相同的路线也有来自 Silex 的 404,但我认为 Web 服务器窃听 PHP/Silex 以响应已被识别为无效的请求是错误的方法。

你真正想做的不是想做的是从 Silex 重定向到一个包含 mark-up 的 404 文档。这样做的目的是告诉用户代理它尝试的URL不正确,它应该尝试另一个(由重定向header提供),然后return在 mark-up 中向人类发送 404 消息,但将 returning 200-OK 发送给用户代理。因此,实际上当用户代理浏览到 /someBadPage.html 时,您会告诉他们 URL 的正确文档是 /404.html。并不是说 /someBadPage.html 不存在。