WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:リンク元IPアドレス

0:[投稿] minchou [2002/03/30 16:44 ][環境:WIN+IE UNIX系+Perl]

CGIの環境変数で、refererを使えばリンク元のアドレスを取得できますが、
リンク元のIPアドレスや、ドメインを取得することは可能でしょうか?


1:[回答] 天上人プサン [2002/03/30 20:41 ]

$domain = $ENV{'HTTP_REFERER'};
$domain =~ s/http:\/\/([^\/]*)\/.*/$1/o;
$ip = gethostbyname($domain);

gethostbynameは私の環境では確認できませんのでお試しください。


2:[回答] minchou [2002/03/31 00:56 ]

なるほど!
余分な文字をカットしてしまえば、ドメイン部分だけが残るということですね。
gethostbynameも試しましたが、文字化けしています。
これは使えないってことですね…。

もう1つ質問させて頂きたいのですが、プロバイダ等の
http://www.プロバイダ.ne.jp/~ユーザ名/test.htm 」のような場合に限っては、
「 www.プロバイダ.ne.jp/~ユーザ名 」までを取得することは可能でしょうか?


3:[回答] ふじ [URL] [2002/03/31 02:05 ]

> gethostbynameも試しましたが、文字化けしています。
gethostbyname がスカラコンテキストで返す値は4バイトで表現されたIPアドレスなので、
数字としてみえるようにしたければ

$ip = gethostbyname($host);
@ip = unpack('C4', $ip);
print join ".", @ip;

こんなかんじで。
もしくは、

use Socket;
print inet_ntoa(inet_aton($host));


4:[回答] minchou [2002/04/02 14:44 ]

IPアドレス取得できました!
ありがとうございます。

ドメインに関しても、色々と試行錯誤した結果、下記にようにすれば、
通常ドメインもプロバイダ等の~以降のアドレスも取得できるようになりました。
しかし、2重にチェックしているので、やぼったい気がします。
1行で書くにはどうすれば良いでしょうか?

$domain = $ENV{'HTTP_REFERER'};
$domain =~ s/http:\/\/([^\/]*\/~[^\/]*)\/.*/$1/o;
$domain =~ s/http:\/\/([^\/]*)\/.*/$1/o;


5:[回答] jam [2002/04/02 17:13 ]

$domain =~ s{^http://(.*?/~.*?|[^/]*)/.*}{$1};
とか


6:[完了] minchou [2002/04/03 12:43 ]

出来ました!

ただ、$domain =~ s{^http://(.*?/~.*?|[^/]*)/.*}{$1};
の意味がよく解らず、取合えず動いているという感じなので、
もっと、勉強したいと思います。

ご書き込んでくださった皆様、どうもありがとうございました。


7:[完了] jam [2002/04/03 14:15 ]

>ただ、$domain =~ s{^http://(.*?/~.*?|[^/]*)/.*}{$1};
>の意味がよく解らず、取合えず動いているという感じなので、
えっと
(.*?/~.*?)   [http://〜/~〜/〜に対応]

([^/]*)         [[http://〜/〜に対応]]

| でつなげただけです。
順番も大事です、先に(.*?/~.*?)を書いてあげないとだめで、
([^/]*)が先だと/が出てきたところでマッチして終わっちまいます。


8:[完了] 天上人プサン [URL] [2002/04/03 15:31 ]

完了しましたか...
密かにどう発展してゆくのか楽しみにしていたんですがね。

----------------------------------------------------------

URLがhttp://ドメイン名であると前提に考えていましたが、
httpsで始まる場合や、http://IPアドレスの場合があるということ、

『~』で始まるものだけでなく、
『cgi-bin』の直前に有るものもユーザーIDとして取得するよう
改良を加えてみました。

$ENV{'HTTP_REFERER'} = "http://www.parkcity.ne.jp/~chaichan/qanda/qa2610.htm?02-04-03-14-15";

$domain = $ENV{'HTTP_REFERER'};
$domain =~ s{.*//([^/]*).*}{$1}o;

$_ = $ENV{'HTTP_REFERER'};
if (s{.*~([^/]*).*}{$1}o or s{.*[/~]([^/^\.]*)/cgi-bin.*}{$1}o) {
$userid = $_
}

if ($domain !~ /\d+\.\d+\.\d+\.\d+$/o) {
$ip = join(".", unpack("C4", gethostbyname($domain)))
} else {
$ip = $domain;
$domain = gethostbyaddr(pack("C4", split(/\./, $ip)), 2) || $ip
}

print << "EOF";
Name     $domain
Address  $ip
UserID   $userid

EOF

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World