Mojolicious: перенаправление в /subdir/subdir/some.cgi не даст абсолютного URL

Я пытаюсь перенаправить в файл /subdir/subdir/some.cgi который вызывает следующий метод:

$self->redirect_to("/anothersubdir/some.html");

Тем не менее, вышеуказанный вызов будет перенаправлен на /subdir/subdir/some.cgi/anothersubdir/some.html вместо. Так как же мне сделать это перенаправить на /anothersubdir/some.html?

1 ответ

Решение

По-видимому, вы должны предоставить абсолютный путь к redirect_to,

Зачем? Потому что redirect_to говорит ... те же аргументы, что и url_for, который генерирует этот URL, если он не является абсолютным. Документы не слишком явные, но источник есть.

Таким образом, вы можете сконструировать новый объект Mojo::URL и передать его redirect_to:

my $url = Mojo::URL->new->base($self->req->url->base->clone)->base->userinfo(undef);
$url = $url->path('/anothersubdir/some.html');
$self->redirect_to( $url );

Или скопировать redirect_to и изменить его, чтобы не использовать url_for

sub redirect_raw {
  my $self = shift;

  # Don't override 3xx status
  my $res = $self->res;
#~   $res->headers->location($self->url_for(@_)->to_abs);
  $res->headers->location();
  return $self->rendered($res->is_status_class(300) ? () : 302);
}
Другие вопросы по тегам