投稿日:2004年07月11日 作成鷹の巣

No.16702 IISサーバーでCGIのURL転送をする場合、Perlのスクリプトの書き方は?



IISサーバーでCGIのURL転送をする場合、Perlのスクリプトの書き方は?

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


WindowsServer2003 IIS6.0 ActivePerl5.8.0.806で全てCGIのURL転送が可能。

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>
と書いて頂いた場合は、どんな表示になりましたでしょうか?


$ENV{PERLXS}の内容は、Perl for ISAPIならPerlIS、Perl for WebSiteならPerlWSが入る。

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


出力ヘッダが正しく出力されないPerlISの初期バージョンは?

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)、よく解らないので丸写しで・・・。


$ENV{PERLXS}は空でしたか。

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)と等価になります。


私のサイトは、CGIの配布サイトではないので、玉虫色で書くことに決めました。

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の違いが良く解りません・・。
ご存じの方、なるべく簡単に教えてください。

それでは・・。


perlis.dllでも同様でした。

No.16734 投稿時間:2004年07月14日(Wed) 20:32 投稿者名:yasuyuki URL:

perlis.dllの設定で同じテストをしましたが、結果は同じでした。

それでは。


参考URL。

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の方がマッチするんですかね?
暇なときに勉強してみます。
それでは。


|目次|掲示板|過去ログ目次|▲頁先頭|