RedirectRefererをさらにパッチ

なんかDoCoMoの端末だとリファラが取れないしぃ〜。
リファラだけに頼るのもなんだしぃ〜。
まあ、前回URLに戻すだけならAFTER_OUTPUTフェーズとかで現在URLを
セッションに入れとけばぁ〜とかいわれたしぃ〜。

やってみました。


package Sledge::Plugin::RedirectReferer;
use strict;
use warnings;
use URI;

our $VERSION = '0.04';
our $LAST_URL_KEY = '_last_url';

sub import {
my $self = shift;
my $pkg = caller;

no strict 'refs';
*{"$pkg\::redirect_referer"} = sub {
my ($self , $url) = @_;
if ( $self->session->param( $LAST_URL_KEY ) || $self->r->header_in('Referer') ) {
my $redirect_url = $self->session->param( $LAST_URL_KEY ) ? $self->session->param( $LAST_URL_KEY )
: $self->r->header_in('Referer');
my $uri = URI->new($redirect_url);
if ( $uri->host eq $self->r->hostname ) {
return $self->redirect($uri->path_query);
} else {
return $self->redirect($uri->as_string);
}
} else {
return $self->redirect($url);
}
};

$pkg->register_hook(
AFTER_OUTPUT => \&store_url,
);
}

sub store_url {
my $self = shift;
$self->session->param( $LAST_URL_KEY => $self->current_url );
}

もっと綺麗に書ける希ガス