« CGI::Application::Plugin::Redirect | メイン | ぱどタウンの部屋ページにJSON »

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が補完されたのが確認できます。

トラックバック

この一覧は、次のエントリーを参照しています: Redirectって相対リンクでもいけるのね。:

» Locationの絶対パス/相対パス from Bar's Hideout
blog.nomadscafe.jp: Redirectって相対リンクでもいけるのね。ずっと絶対リンクでないと動かないものだと思っていたんだけど、違ったようだ Netscape 6以前とiモード端末の503iシリーズ以前では絶対パスでないと正常に動作しません。 RFC的にも絶対パスがmustなんですが... [詳しくはこちら]

» 絶対パスと相対パス from ネットビジネス用CGI Perl HTML Javascriptの情報サイト

  CGIファイルを設定するとき意外でも、普通にHTMLでホームページを作成するときなどにも登場するのが、絶対パスと相対パスという用語です。

... [詳しくはこちら]