Redirectって相対リンクでもいけるのね。
ずっと絶対リンクでないと動かないものだと思っていたんだけど、違ったようだ。
恥さらしエントリーかもしれないけど、確認の意味も含めて。
#!/usr/bin/perl use strict; use CGI; my $q = CGI->new; print $q->redirect('hoge.cgi');
だけで同じ階層にあるhoge.cgiへ302 redirectされる。
FirefoxのLive HTTP
HeaderでResponse Headerをみると
HTTP/1.x 302 Moved Date: Fri, 16 Sep 2005 14:35:08 GMT Server: Apache Location: hoge.cgi Connection: close Transfer-Encoding: chunked Content-Type: text/plain
Locationがhoge.cgiだけなのでApacheが補完してくれている訳でもなさそう。ちょっと以前はだめだったような気もするし、クライアント側の機能なのかしら。FirefoxとSafariで確認して、wgetでもOK。LWPもソースをみる限り大丈夫そう。大体大丈夫なのかしら。
CGI.pmのperldocには、
You should always use full URLs (including the http: or ftp: part) in redirection requests. Relative URLs will not work correctly.
とあるので絶対リンクを使うことが推奨みたいですが、、むぅ。
相対リンクから絶対リンクへの変換は、URIモジュールを使うと簡単
use URI; my $uri = URI->new_abs("相対リンク","ベースURI");
CGI.pmと組み合わせたときは、上のhoge.cgiの例でいくと。
#!/usr/bin/perl use CGI; use URI; my $q = CGI->new; print $q->redirect( URI->new_abs('hoge.cgi',$q->url) );
となります。再度headerを確認すると
HTTP/1.x 302 Moved Date: Fri, 16 Sep 2005 14:59:50 GMT Server: Apache Location: http://example.com/hoge.cgi Connection: close Transfer-Encoding: chunked Content-Type: text/plain
となってLocationが補完されたのが確認できます。