【问题标题】:Custom 404 route not matching website root自定义 404 路由与网站根目录不匹配
【发布时间】:2014-04-24 07:49:16
【问题描述】:

我为我的 Mojolicious 应用程序定义了几条路线和一条包罗万象的 404 路线:

$r->any('*')->to(cb => sub {
    my $self = shift;
    $self->render(text => '404 Not Found');
    $self->rendered(404);
});

404 路由工作正常:

$ ./bin/myapp.pl -m production get /no_such_url
404 Not Found

但我也希望 404 路由匹配网站根目录,而且我总是得到一些默认的 Mojolicious 404,即使在生产模式下也是如此:

$ ./bin/myapp.pl -m production get /
<!DOCTYPE html>
<html>
  <head><title>Page not found</title></head>
…

我需要做什么才能在/ 上提供我的普通 404 回调?

【问题讨论】:

    标签: perl url-routing mojolicious


    【解决方案1】:

    any '*' 不会捕获主索引 / 是正确的。这似乎是一个例外。有两种简单的解决方案:

    您可以为您的路线创建一个别名。请注意我们在设置渲染文本之前如何设置渲染代码:

    use Mojolicious::Lite;
    
    sub my404 {
        my $self = shift;
        $self->rendered(404);
        $self->render(text => '404 any *');
    
    }
    
    any '*' => \&my404;
    any '/' => \&my404;
    
    app->start;
    

    您也可以覆盖默认的 404 not found 模板,如 Rendering exception and not found pages 中所述:

    use Mojolicious::Lite;
    
    app->start;
    
    __DATA__
    
    @@ not_found.development.html.ep
    404 default template
    

    【讨论】:

    • 我去了明确的/ 路线,谢谢!顺便说一句,我是否需要在设置文本之前设置渲染代码?反过来,我的代码也能正常工作。
    • 是的,在正文前指定您的代码。如果你真的检查你的标题,如果你先指定文本,你会看到你得到了 200 OK。
    • ……但我的测试用例明确测试了status_is(404) 并通过了。什么给了?
    • 这似乎是日志记录的错误。我检查了两种情况下发送到浏览器的标头,它们正确设置了 404 Not Found。但是,mojo 使用文本后设置的代码将响应记录为 200 OK。因此,您的测试用例将正常工作,但日志不会包含正确的数据。
    猜你喜欢
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2015-07-15
    • 2022-01-19
    • 1970-01-01
    • 2016-04-29
    相关资源
    最近更新 更多