投稿日:2002年12月26日 作成鷹の巣

No.7323 バーチャルホストごとに異なるアクセス制御(許可IP)を設定するには?



バーチャルホストごとに異なるアクセス制御(許可IP)を設定するには?

No.7323 投稿時間:2002年12月26日(Thu) 10:20 投稿者名:うさぎ URL:

AnHTTPDでバーチャルホストごとに異なるアクセス制御(許可、拒否IP)を設定したいのですが、あるホストのアクセス制御を設定すると
他のバーチャルホストが同一設定になってしまいます。
AnHTTPDはホストごとに設定を変えることはできないのでしょうか?
ご存知の方がみえたらご教授ください。


できません。認証も同一になってしまいます。

No.7329 投稿時間:2002年12月26日(Thu) 11:09 投稿者名:ハル URL:

> AnHTTPDでバーチャルホストごとに異なるアクセス制御(許可、拒否IP)を設定したいのですが、あるホストのアクセス制御を設定すると
> 他のバーチャルホストが同一設定になってしまいます。
> AnHTTPDはホストごとに設定を変えることはできないのでしょうか?
> ご存知の方がみえたらご教授ください。

できません。
ちなみに、認証も同一になってしまいます。#注意


すべてCGIで組めばできます

No.7331 投稿時間:2002年12月26日(Thu) 11:23 投稿者名:OAK URL:

> できません。
> ちなみに、認証も同一になってしまいます。#注意

すべてCGIで組めばできます


参考HPを教えてください

No.7336 投稿時間:2002年12月26日(Thu) 12:11 投稿者名:うさぎ URL:

OAKさん、ありがとうございます。
CGIで組む方法について述べてあるHPやテキストを
ご存知でしたら教えてください。


IPアドレスにより画像を変える方法

No.7334 投稿時間:2002年12月26日(Thu) 12:04 投稿者名:うさぎ URL:

ハルさん、ありがとうございます。
サーバー側で解決できなければ、
タグでタイトルのような事ができれば解決するのですが・・
そんな事ができるのでしょうか?


CGI ならできます

No.7344 投稿時間:2002年12月26日(Thu) 14:47 投稿者名:OAK URL:

> ハルさん、ありがとうございます。
> サーバー側で解決できなければ、
> タグでタイトルのような事ができれば解決するのですが・・
> そんな事ができるのでしょうか?

次のようなCGIを組みます。

(1)イメージファイル名を IPアドレスとかドメインで決めます。
(2)Content-type: image/jpeg\n\n を出します
(3)ファイルをオープンしバイナリーで読みSTDOUTに出す。

10行程度で出来ますから練習でやってみては?


CGI作ってみましたが・・

No.7362 投稿時間:2002年12月27日(Fri) 04:08 投稿者名:うさぎ URL:

OAKさん、アドバイスありがとうございます。
今まで構文にかかわる部分は避けてきたので、
今回がプログラミング初体験です。アイデアは
1.アクセスした人のIPアドレスを取得
2.IPアドレスを入力するフォームを表示させ
3.入力されたIPアドレスとアクセスした人の
IPアドレスが一致⇒a.jpg、不一致⇒b.jpg
というつもりで以下のものをつくったのですが
常にb.jpgとContent-type: image/jpegという
文字が出てしまいます。どこかいけないのでしょうか?
このCGI名はchange.cgi、
windowsサーバなのでパールのパスはいりません。

$ADDR = $ENV{'REMOTE_ADDR'};
print "Content-type: text/html\n\n";
print "<html><body><form method=post action=change.cgi>
IPアドレス<input name=$IP><input type=submit value=入力>
</form></body></html>\n";
if ($ADDR eq $IP ) {
print "Content-type: image/jpeg\n\n";
print "<html><body><img src=a.jpg></body><html>";}
elsif ($ADDR ne $IP ) {
print "Content-type: image/jpeg\n\n";
print "<html><body><img src=b.jpg></body><html>";}


form でinput された物は$ENV{'QUERY_STRING'};でないと取り出せません

No.7366 投稿時間:2002年12月27日(Fri) 11:52 投稿者名:OAK URL:


ちょっと違います。

私はイメージをCGIで作るつもりで書きました。
つまりhtmlは
<html><body><img src="img.cgi"></body><html>
とCGIでなく書いて

img.cgi では
$filename= 'b.jpg';
if ($ADDR eq '127.0.0.1' ) { $filename='a.jpg' ;}
print "Content-type: image/jpeg\n\n";
open(FH,"<$filename")
binmode(STDOUT);
binmode(FH);
print <FH>
close(FH);

HTMLはCGIで書かないで、イメージをCGIで書く
サーバーからだとa.jpg 他からは b.jpg になる。と言う意味です

貴方のやり方(HTMLをCGIで書く)ですと、
$IP='127.0.0.1';
$ADDR = $ENV{'REMOTE_ADDR'};
print "Content-type: text/html\n\n";
print "<html><body><form method=post action=change.cgi>
if ($ADDR eq $IP ) {print "<html><body><img src=a.jpg></body><html>";}
els {print "<html><body><img src=b.jpg></body><html>";}

です。
貴方のCGIの中に<input>がありますが、
form でinput された物は$ENV{'QUERY_STRING'};でないと取り出せません
チェックしてませんのでこのまま動くかはわかりません


どうやればできるのでしょうか?

No.7372 投稿時間:2002年12月27日(Fri) 13:38 投稿者名:ハル URL:

OAKさんこんにちは。亀レスですが、

>すべてCGIで組めばできます

との事ですが、どの様にするのでしょうか?
後学のためにご教授下さい。m(._.)m ペコッ

# SERVER_NAMEでとる方法は、ApacheだとVirtual Hostで指定した
# ドメイン名を返しますが(Linuxで確認、Winは未確認)、
# AnHTTPDだと、PCの名前を返してきます。


設置ディレクトリーでわかっているはずです

No.7400 投稿時間:2002年12月27日(Fri) 20:23 投稿者名:OAK URL:

> OAKさんこんにちは。亀レスですが、
>
> >すべてCGIで組めばできます
>
> との事ですが、どの様にするのでしょうか?
> 後学のためにご教授下さい。m(._.)m ペコッ
>
> # SERVER_NAMEでとる方法は、ApacheだとVirtual Hostで指定した
> # ドメイン名を返しますが(Linuxで確認、Winは未確認)、
> # AnHTTPDだと、PCの名前を返してきます。

バーチャルホストは呼び出しドメインでアクセスディレクトリーを変えるのですから
SERVER_NAMEで取らなくてもドメインは設置ディレクトリーでわかっているはずです。


Virtual Hostは、呼び出されるCGIも別々なので、ドメイン名判別は要らないって事ですね。

No.7401 投稿時間:2002年12月27日(Fri) 20:38 投稿者名:ハル URL:

> バーチャルホストは呼び出しドメインでアクセスディレクトリーを変えるのですから
> SERVER_NAMEで取らなくてもドメインは設置ディレクトリーでわかっているはずです。

レスありがとうございます。
Virtual Hostって事は、別ディレクトリで、呼び出されるCGIも別、、
って事はドメイン名判別は要らないって事ですね、、(^_^;
後は、IPを判別して、アクセス制限代わりにすれば良いと・・・
う~ん、頭の中だけで考えたらダメですねぇ (_ _ )/ハンセイ

htmlは別にして、perlで読み込んで吐き出せば、htmlのメンテも楽と・・・

あっ、私がドメイン別にIP制限をかけたい、スレ元では無かった、、(笑)


画像をCGIでつくる方法は初めて見ました

No.7410 投稿時間:2002年12月28日(Sat) 06:42 投稿者名:うさぎ URL:

OAKさん、丁寧に教えていただきありがとうございます。
画像の置き場所にCGIをおいて環境変数により異なる画像を出力する
方法は初めてなので、こんな使い方があると知って感動しています。
ただ実行してみたのですが、画像が表示されません。(X印)
public_htmlの中には以下のファイルを置きました。

(1)index.html(<html><body><img src="img.cgi"></body><html>)
(2)a.jpg,bjpg
(3)img.cgi

$ADDR = $ENV{'REMOTE_ADDR'};
$filename= 'b.jpg';
if ($ADDR eq '127.0.0.1' ) { $filename='a.jpg' ;}
print "Content-type: image/jpeg\n\n";
open(FH,"<$filename")
binmode(STDOUT);
binmode(FH);
print <FH>
close(FH);

CGIはこのディレクトリでも実行可能です。
ぜひこの使い方をマスターしたいので
なにがいけないのかご指導おねがい致します。


カウンターはたいてい画像をCGIで渡します

No.7412 投稿時間:2002年12月28日(Sat) 09:10 投稿者名:OAK URL:

>
> $ADDR = $ENV{'REMOTE_ADDR'};
> $filename= 'b.jpg';
> if ($ADDR eq '127.0.0.1' ) { $filename='a.jpg' ;}
> print "Content-type: image/jpeg\n\n";
> open(FH,"<$filename")
> binmode(STDOUT);
> binmode(FH);
> print <FH>
> close(FH);

このままコピペしてチェック&行しましたが4箇所直さないと動きません
ファイルの属性は755です。
(1)先頭に #!/usr/bin/perl (これはWindowsでは?です)
(2)if(){ の後ろに全角スペースあり
(3)open と最後の print に ; がない。

Windowsでも perl -c でチェックできますよね。

(参考)私のTOPページの画像はCGIです。その中身は
#!/usr/bin/perl
$fnm="p.jpg";
print "Content-type: image/jpeg\n";
print "\n";

binmode(STDOUT);
open(FHH , "<$fnm");
binmode(FHH);
print <FHH>;
close(FHH);

exit(0);
######################## program end ########################
本当はファイル読み取り部分はループにしなければいけないのですが
バイナリーだとそれほど大きくないファイルだと1度で読めるので問題はないはず。

カウンターはたいてい画像をCGIで渡します。


プロキシ経由だと別画像がでます。ありがとうございました。

No.7473 投稿時間:2002年12月29日(Sun) 11:21 投稿者名:うさぎ URL:

OAKさん、ありがとうございます。とうとう成功しました。
プロキシ経由だとちがう画像がでてきた時には"おおっ"
と言ってしまいました。
ただ127.0.0.1の所を変数化して、データベースに問い合わせる形
にしようと思います。queryとやらがでてきたのでまた勉強です。


$ENV{'QUERY_STRING'}でとりだしてるつもりなのですが

No.7479 投稿時間:2002年12月29日(Sun) 18:19 投稿者名:うさぎ URL:

OAKさんに教えていただいたimg.cgiに少し手を加えて
フォームから入力のあったIPアドレスと自分のアドレスが
一致すればa.jpg,そうでなければb.jpgがでるつもりで、
以下のファイルをつくりましたが、一致しているにもかかわらず、
b.jpgがでてしまいます。なにが勘違いなんでしょうか?

(1)index.html

<html><body>
<form action="img.cgi" method="GET">
IPアドレス<input type="text" name="IP">
<input type="submit" value="入力">
</form><BR>
<img src="img.cgi">
</body><html>

(2)a.jpg,b.jpg
(3)img.cgi

$IP = $ENV{'QUERY_STRING'};
$ADDR = $ENV{'REMOTE_ADDR'};
$filename= 'b.jpg';
if ($ADDR eq $IP ) { $filename='a.jpg' ;}
print "Content-type: image/jpeg\n\n";
open(FH,"<$filename");
binmode(STDOUT);
binmode(FH);
print <FH>;
close(FH);


QUERY_STRINGの中身は

No.7481 投稿時間:2002年12月29日(Sun) 19:08 投稿者名:OAK URL:

> $IP = $ENV{'QUERY_STRING'};
> $ADDR = $ENV{'REMOTE_ADDR'};
> $filename= 'b.jpg';
> if ($ADDR eq $IP ) { $filename='a.jpg' ;}
> print "Content-type: image/jpeg\n\n";
> open(FH,"<$filename");
> binmode(STDOUT);
> binmode(FH);
> print <FH>;
> close(FH);

最後に
open (FH,">test.dat");
print FH $IP;
とでも付け加えて'QUERY_STRING'がどういう文字データか見ればわかります


split関数で解決しました。ありがとうございます。

No.7543 投稿時間:2003年01月01日(Wed) 18:10 投稿者名:うさぎ URL:

OAKさん(というより先生)あけましておめでとうございます、
いいお年玉をいただき、ありがとうございます♪
わかりました!、データが=でつながっているから
分割しなくてはいけないのですね。
IPアドレスの数字だけを$IPと定義したら成功しました。
今年もよろしくお願いします。


あるcgiで取得した変数を別のcgiに送る方法

No.7574 投稿時間:2003年01月02日(Thu) 16:06 投稿者名:うさぎ URL:

CGI間でデータを共有したいのですが
ファイルに書き込んで、開いてという
以外に方法はあるのでしょうか?
以下のような事がやりたいのですが・・

-img.cgi-
$ADDR = $ENV{'REMOTE_ADDR'};
$ADDRX = x.cgiで取得したIPアドレス;
$filename= 'b.jpg';
if ($ADDR eq $ADDRX) {$filename='a.jpg';}
print "Content-type: image/jpeg\n\n";
open(FH,"<$filename");
binmode(STDOUT);
binmode(FH);
print <FH>;
close(FH);

-x.cgi-
$ADDRX = $ENV{'REMOTE_ADDR'};
以下略


解決しました

No.7593 投稿時間:2003年01月03日(Fri) 15:46 投稿者名:うさぎ URL:

$ADDRX = $ENV{'REMOTE_ADDR'}をデータファイルに出力して
それをimg.cgiが読み取るようにしたら成功しました。
段々とスクリプトの意味がわかってきました。


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