No.16702 投稿時間:2004年07月11日(Sun) 23:49 投稿者名:鷹の巣 URL:http://sakaguch.com/
サイト全体の引越し(URL転送)についての覚書
http://park12.wakwak.com/~webring/redirect.html
に書いていることですが、
sampleA.cgiにアクセスがあると、sampleB.cgiにURL転送する場合、
AN HTTPDやApacheでは、
http://www.example.com/cgi-bin/sampleA.cgiに以下の様な内容を
perlで書いておけば、URL転送が出来ることは確認しています。
------------------------------------------
sampleA.cgiの内容
#!/bin/perl
print "Status: 301 Moved Permanently\n";
print "Content-type: text/html\n";
print "Location: http://www.example.com/cgi-bin/sampleB.cgi\n\n";
------------------------------------------
これをIISに拡張する場合、現在は
------------------------------------------
if( $ENV{PERLXS} eq "PerlIS" ) {
# IISサーバーの場合
print "HTTP/1.0 301 Moved Permanently\r\n"; <---※
} else {
print "Status: 301 Moved Permanently\n";
}
print "Content-type: text/html\n";
print "Location: http://www.example.com/cgi-bin/sampleB.cgi\n\n";
------------------------------------------
としているのですが、※印の部分を
print "Status: 301 Moved Permanently\n";
や
print "Status: 301 Moved Permanently\r\n";
にした場合、IISサーバーでは、URL転送出来ないでしょうか?
IISサーバーをご使用されている方がありましたら、ぜひ実験結果を教えて下さい。
参考URL:
CGI プログラムの改良案/ヘッダの書き方
http://hp.vector.co.jp/authors/VA014833/CGI/header.html#CGI-Field
[Chapter 3] 3.7 Status Codes(英文)
http://www.oreilly.com/openbook/cgi/ch03_07.html#CGI-CHP-3-SECT-7
Web Programming (CGI and PerlIS)(英文)
http://www.4images.com/ntperl/Perl_for_Win32_FAQ_7.html
No.16705 投稿時間:2004年07月12日(Mon) 15:06 投稿者名:yasuyuki URL:
> サイト全体の引越し(URL転送)についての覚書
> http://park12.wakwak.com/~webring/redirect.html
> に書いていることですが、
>
> sampleA.cgiにアクセスがあると、sampleB.cgiにURL転送する場合、
> AN HTTPDやApacheでは、
>
> http://www.example.com/cgi-bin/sampleA.cgiに以下の様な内容を
> perlで書いておけば、URL転送が出来ることは確認しています。
>
> ------------------------------------------
> sampleA.cgiの内容
> #!/bin/perl
> print "Status: 301 Moved Permanently\n";
> print "Content-type: text/html\n";
> print "Location: http://www.example.com/cgi-bin/sampleB.cgi\n\n";
> ------------------------------------------
>
> これをIISに拡張する場合、現在は
> ------------------------------------------
> if( $ENV{PERLXS} eq "PerlIS" ) {
> # IISサーバーの場合
> print "HTTP/1.0 301 Moved Permanently\r\n"; <---※
> } else {
> print "Status: 301 Moved Permanently\n";
> }
> print "Content-type: text/html\n";
> print "Location: http://www.example.com/cgi-bin/sampleB.cgi\n\n";
> ------------------------------------------
> としているのですが、※印の部分を
> print "Status: 301 Moved Permanently\n";
> や
> print "Status: 301 Moved Permanently\r\n";
> にした場合、IISサーバーでは、URL転送出来ないでしょうか?
> IISサーバーをご使用されている方がありましたら、ぜひ実験結果を教えて下さい。
>
> 参考URL:
> CGI プログラムの改良案/ヘッダの書き方
> http://hp.vector.co.jp/authors/VA014833/CGI/header.html#CGI-Field
> [Chapter 3] 3.7 Status Codes(英文)
> http://www.oreilly.com/openbook/cgi/ch03_07.html#CGI-CHP-3-SECT-7
> Web Programming (CGI and PerlIS)(英文)
> http://www.4images.com/ntperl/Perl_for_Win32_FAQ_7.html
いつもお世話になっております。
僕の環境は、WindowsServer2003 IIS6.0 ActivePerl5.8.0.806です。
CGIは全然解らないのですが、一応テストした結果は、記載されている3種類すべて飛びました。
飛ばした先の「sample.cgi」の内容は、
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print <<"HTML";
<html>
<head>
<title>HELLO</title>
<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">
<meta name="robots" content="INDEX,NOFOLLOW">
</head>
<body>HELLO</body>
</html>
HTML
exit;
上記のようなものです。(サンプルで記載されていた物を"HELLO"表示に変えただけですが・・・・。)
これじゃ、簡単すぎてダメでしょうか?
No.16717 投稿時間:2004年07月14日(Wed) 01:07 投稿者名:鷹の巣 URL:http://sakaguch.com/
> 僕の環境は、WindowsServer2003 IIS6.0 ActivePerl5.8.0.806です。
>
> CGIは全然解らないのですが、一応テストした結果は、記載されている3種類すべて飛びました。
ということは、
sampleA.cgiの内容
#!/bin/perl
print "Status: 301 Moved Permanently\n";
print "Content-type: text/html\n";
print "Location: http://www.example.com/cgi-bin/sampleB.cgi\n\n";
のままでも、転送できるということですね。
教えて頂き、ありがとうございました。
> 飛ばした先の「sample.cgi」の内容は、
> ...
> これじゃ、簡単すぎてダメでしょうか?
実験ですから、飛び先はCGIでなくとも普通のHTMLファイルでもなんでも良いです。
> #!/usr/local/bin/perl
これは、
#!C:/usr/local/bin/perl.exe
と同じでしょうか?
> <body>HELLO</body>
念のためにこの内容は、
<body>
HELLO
$ENV{PERLXS}
</body>
と書いて頂いた場合は、どんな表示になりましたでしょうか?
No.16720 投稿時間:2004年07月14日(Wed) 01:28 投稿者名:Iwa URL:http://www.ethersky-online.net
横から失礼します。
> > #!/usr/local/bin/perl
> これは、
> #!C:/usr/local/bin/perl.exe
> と同じでしょうか?
全然違います。
前者はUnix系列のOSのためのものです。
Unix系OSのルートは / です。
Windows系OSでのルートはドライブごとにC:/ や D:/ などです。
つまり、それぞれのルートからの絶対パスになるのでイコールではありません。
> 念のためにこの内容は、
> <body>
> HELLO
> $ENV{PERLXS}
> </body>
Perl for ISAPIで動作しているならばPerlISが、Perl for WebSiteで動作しているならばPerlWSが入っているはずです。
http://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq7j.html
No.16721 投稿時間:2004年07月14日(Wed) 02:11 投稿者名:鷹の巣 URL:http://sakaguch.com/
色々と教えて頂きありがとうございます。
> 全然違います。
> 前者はUnix系列のOSのためのものです。
> Unix系OSのルートは / です。
> Windows系OSでのルートはドライブごとにC:/ や D:/ などです。
> つまり、それぞれのルートからの絶対パスになるのでイコールではありません。
つまり、転送先のCGIは、IIS6.0ではなく、UNIX系のCGIだということですね。
> > 念のためにこの内容は、
> > <body>
> > HELLO
> > $ENV{PERLXS}
> > </body>
>
> Perl for ISAPIで動作しているならばPerlISが、Perl for WebSiteで動作しているならばPerlWSが入っているはずです。
> http://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq7j.html
従って、転送先のCGIの環境変数$ENV{PERLXS}には、null文字が入っているので、
上記のCGIの変更は、意味がないということですね。
yasuyukiさんへ
転送元のCGI(IIS6.0)の環境変数$ENV{PERLXS}には、何が入っているのでしょうか?
出力ヘッダが正しく出力されないPerlISの初期バージョンは、
IISのどのバージョンからなのか、ご存知の方がおられましたら教えて下さい。
http://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq7j.html#My_CGI_scripts_don_t_seem_to_run
No.16722 投稿時間:2004年07月14日(Wed) 11:15 投稿者名:yasuyuki URL:
ごめんなさい・・。
良くわからないので全部貼っておきます。
以下が、転送元のファイルです。
これを3種類作りテストしました。
1)print "HTTP/1.0 301 Moved Permanently\r\n";
2)print "Status: 301 Moved Permanently\n";
3)print "Status: 301 Moved Permanently\r\n";
'以下ソースです。
#!/usr/local/bin/perl
# CGI(Perl)でのURL転送その2(汎用)
# 引越し先の新URL(引数のない転送先URL)をここに設定
$URLnew = "http://×××.com/sample.cgi";
# Locationヘッダが使えないWebサーバーや案内画面を表示する場合は、1にする。
$FlagLocation = 0;
# 引数の取得
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $hikisuu, $ENV{'CONTENT_LENGTH'});
} else {
$hikisuu = $ENV{'QUERY_STRING'};
}
# 新URLに引数(転送先URL)を連結
if ( $hikisuu eq "" ) {
$URLmove = $URLnew;
} else {
$URLmove = $URLnew . "?" . $hikisuu;
}
if ($ENV{'HTTP_USER_AGENT'} =~ /slurp|msnbot/i) {
# 以下のinktomi系(MSN,Yahoo)のクローラの場合には、
# URLの移転表示のみを行い、URL転送しない。
# Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)
# Mozilla/5.0 (Slurp/si; slurp@inktomi.com; http://www.inktomi.com/slurp.html)
# Mozilla/3.0 (Slurp/cat; slurp@inktomi.com; http://www.inktomi.com/slurp.html)
# msnbot/0.11 (+http://search.msn.com/msnbot.htm)
print "Content-type: text/html\n\n";
print <<"HTML";
<html>
<head>
<title>301 Moved Permanently</title>
<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">
<meta name="robots" content="INDEX,NOFOLLOW">
</head>
<body>アクセスされたURLは、$URLmoveに移転しました。</body>
</html>
HTML
} else {
# URL転送を行なう。
if ($FlagLocation) {
print "Content-type: text/html\n\n";
print <<"HTML";
<html>
<head>
<title>301 Moved Permanently</title>
<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">
<meta http-equiv="refresh" CONTENT="0;URL=$URLmove">
<meta name="robots" content="INDEX,NOFOLLOW">
</head>
<body>0秒後に <a href="$URLmove">$URLmove</a> に移動します。</body>
</html>
HTML
}else{
if( $ENV{PERLXS} eq "PerlIS" ) {
# IISサーバーの場合
print "HTTP/1.0 301 Moved Permanently\r\n";
} else {
print "Status: 301 Moved Permanently\n";
}
print "Content-type: text/html\n";
print "Location: $URLmove\n\n";
}
}
exit;
'ここ迄です。
※ちなみにperlの先頭行はIISの場合は関係ないんですよね?確か・・・。
それでは。
No.16723 投稿時間:2004年07月14日(Wed) 11:19 投稿者名:yasuyuki URL:
ちなみに下記のようにしても表示は同じでした。
<body>
HELLO
$ENV{PERLXS}
</body>
No.16724 投稿時間:2004年07月14日(Wed) 15:53 投稿者名:Iwa URL:http://www.ethersky-online.net
> ちなみに下記のようにしても表示は同じでした。
> <body>
> HELLO
> $ENV{PERLXS}
> </body>
え゛・・・。
ちゃんと
print "<body>\n";
print HELLO<br>\n";
print "$ENV{PERLXS}\n"
print "</body>\n";
または
print <<"HTML";
<body>
HELLO<br>
$ENV{PERLXS}
</body>
HTML
としましたか?
シングルクォートで括ったり、q()で括ったりするとただの文字列として処理されるので$ENV{PERLXS}がそのまま文字として表示されちゃいます。
このハッシュENVのキーPERLXSの中身が本当に空ならその部分は何も表示されません。
あと、HTMLを吐くことを示すヘッダ(Content-type: text/html)を忘れないように。(もっとも、忘れるとInternal Server Errorになりますが)
No.16725 投稿時間:2004年07月14日(Wed) 16:23 投稿者名:yasuyuki URL:
> > ちなみに下記のようにしても表示は同じでした。
> > <body>
> > HELLO
> > $ENV{PERLXS}
> > </body>
>
> え゛・・・。
> ちゃんと
>
> print "<body>\n";
> print HELLO
\n";
> print "$ENV{PERLXS}\n"
> print "</body>\n";
>
> または
>
> print <<"HTML";
> <body>
> HELLO
> $ENV{PERLXS}
> </body>
> HTML
>
> としましたか?
>
> シングルクォートで括ったり、q()で括ったりするとただの文字列として処理されるので$ENV{PERLXS}がそのまま文字として表示されちゃいます。
> このハッシュENVのキーPERLXSの中身が本当に空ならその部分は何も表示されません。
>
> あと、HTMLを吐くことを示すヘッダ(Content-type: text/html)を忘れないように。(もっとも、忘れるとInternal Server Errorになりますが)
一応、表示されたのは「HELLO」のみでした。
ソース全文は下記の通りです。
'ここから--------
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print <<"HTML";
<html>
<head>
<title>HELLO</title>
<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">
<meta name="robots" content="INDEX,NOFOLLOW">
</head>
<body>HELLO$ENV{PERLXS}</body>
</html>
HTML
exit;
'ここまで---------------------
CGI(perl)、よく解らないので丸写しで・・・。
No.16726 投稿時間:2004年07月14日(Wed) 17:16 投稿者名:Iwa URL:http://www.ethersky-online.net
> 一応、表示されたのは「HELLO」のみでした。
てことは$ENV{PERLXS}は空でしたか。
ちなみに↓
print "Content-type: text/html\n\n";
print <<"HTML";
<html>
<head>
<title>HELLO</title>
---略---
HTML
これは
print <<"HTML";
Content-type: text/html
<html>
<head>
<title>HELLO</title>
---略---
HTML
とも書けます。
Content-typeの行の下をもう一行あけることで改行2回(ここではラインフィード2回 \n\n)と等価になります。
No.16728 投稿時間:2004年07月14日(Wed) 17:36 投稿者名:鷹の巣 URL:http://sakaguch.com/
お世話になっております。
#!/usr/local/bin/perl
print "Status: 301 Moved Permanently\n";
print "Content-type: text/html\n";
print "Location: http://www.example.com/cgi-bin/sampleB.cgi\n\n";
として、環境変数$ENV{PERLXS}を全く意識せずに私が動作を確認していた環境は、以下の通りです。
●AN HTTPD 1.42k(Windows XP Home)、Active Perl 5.8.4(perl.exe)
●AN HTTPD 1.42k(Windows XP Home)、Active Perl 5.8.4(PerlIS.dll) ← ※ $ENV{PERLXS}の内容は"PerlIS"です。
●Apache/2.0.49(FreeBSD)、perl 5.8.4
●プロバイダWAKWAK-Apache/2.0.50(FreeBSD)、perl 5.8.2
※で頁移動できたことから、わからなくなって今回の投稿に至りました。
> > 一応、表示されたのは「HELLO」のみでした。
> てことは$ENV{PERLXS}は空でしたか。
多分、yasuyukiさんのご確認されたIIS6.0の環境では、
1.スクリプトの先頭行のperlへのパスが無視されている。OS(システム)でperlへのパスが通っている。
2.Active Perl 5.8.0のperl.exeが使用されている?
従って、「テスト結果は、記載の3種類すべて飛んだ。」ということではないでしょうか???
私のサイトは、CGIの配布サイトではないので、$ENV{PERLXS}のif文を使用せずに
以下の様に玉虫色で書くことに決めました。
#!/usr/local/bin/perl
print "Status: 301 Moved Permanently\n";
# 古いIISで、頁移動しない場合は、上の行を
# print "HTTP/1.0 301 Moved Permanently\r\n";
# に変更して下さい。
print "Content-type: text/html\n";
print "Location: http://www.example.com/cgi-bin/sampleB.cgi\n\n";
色々とテストにお付き合いして頂き、ありがとうございました。
> CGI(perl)、よく解らないので丸写しで・・・。
私もperlの標準関数やモジュールの使用方法がわかってないので、
とほほさんのperl入門やperldocやhelpやmanをよく読んでいます。
No.16732 投稿時間:2004年07月14日(Wed) 18:11 投稿者名:yasuyuki URL:
テスト環境は、perl.exe "%s" %s で設定しています。
IISは昔(4.0頃)から先頭行は無視しますよね? それ以前はよく知りませんが。
違うのかな?
perlis.dllもテストしてみた方が良いですか?
一応、別のホストはこっちの設定になっていますが・・・。
帰宅後に、少しやってみて結果を報告しておきます。
追伸、perlis.dllとperl.exeの違いが良く解りません・・。
ご存じの方、なるべく簡単に教えてください。
それでは・・。
No.16734 投稿時間:2004年07月14日(Wed) 20:32 投稿者名:yasuyuki URL:
perlis.dllの設定で同じテストをしましたが、結果は同じでした。
それでは。
No.16735 投稿時間:2004年07月14日(Wed) 21:03 投稿者名:Iwa URL:http://www.ethersky-online.net
> 追伸、perlis.dllとperl.exeの違いが良く解りません・・。
> ご存じの方、なるべく簡単に教えてください。
http://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq2j.html
↑の中の
http://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq2j.html#What_is_ISAPI_
http://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq2j.html#What_is_Perl_for_ISAPI_
http://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq2j.html#Why_should_I_use_Perl_for_ISAPI_
をご覧あれ。
No.16737 投稿時間:2004年07月14日(Wed) 22:01 投稿者名:yasuyuki URL:
ありがとうございます。
一長一短があると言うことですね。
IISの趣旨(方向性)から言うとPerl.exeの方がマッチするんですかね?
暇なときに勉強してみます。
それでは。