【问题标题】:404 status code returned by silex is not redirected by .htaccesssilex 返回的 404 状态码未被 .htaccess 重定向
【发布时间】:2016-07-17 21:56:31
【问题描述】:

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

谢谢

【问题讨论】:

    标签: .htaccess silex


    【解决方案1】:

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

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

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

    【讨论】:

    • 你不想重定向到 404 页面,你想 404 他们浏览到的页面。练习的目的不是简单地返回一个说“我们没有那个页面”的视图,而是要告诉 浏览器(更重要的是搜索引擎)该 URL已请求 不可用。不是说“我认为您指的是这个页面”的响应,这就是重定向的含义。
    【解决方案2】:

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

    告诉网络服务器 404.shtml 是要发送回浏览器的标记,这不像 重定向 到那个页面,它只是使用那个文件的内容作为 HTML 来用 404 响应发回。

    Silex 对此一无所知,因为当 Silex 接近请求时,Web 服务器的 404 处理早已不存在了。当 Silex 结束时出现 404 条件时,您需要做两件事:在响应中返回 404 代码(您现在正在这样做),并且您也可以选择发送一些内容(例如 404 中的标记) .shtml 文件)。如果您想拥有与 Web 服务器使用的 404.shtml 相同的 404 标记...请阅读该文件并将其作为 404 响应的内容返回。

    您可以尝试使用不同的路由并重新调整您的网络服务器 404 以返回 Silex 路由 URL 的结果,然后在内部也使用相同的路由来处理来自 Silex 的 404 的内容,但我认为这是错误的让 Web 服务器对 PHP/Silex 进行窃听以响应已被识别为无效的请求的方法。

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

    【讨论】:

    • 为没有任何解释的反对票欢呼。这确实有助于社区。不错的作品。干得好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2011-01-19
    相关资源
    最近更新 更多