はじめまして。初めて質問させて頂きます。

Perlで作成されたCGIスクリプト内で、i-modeとJ-phone端末からでしかアクセスできないようにする事ってどのようにスクリプトを組めばよいのでしょうか。
PCからアクセスすると、携帯からのアクセスして下さいといったエラー画面が出るようにしたいのですが。

よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

携帯電話からのアクセスは


ezweb.ne.jp
ido.ne.jp
docomo.ne.jp
jp-t.ne.jp
jp-c.ne.jp
jp-q.ne.jp
がほとんど(というかほぼすべて)なので
これ以外のサーバからのアクセスは拒否すれば携帯専用になります。
補足説明ですが、各携帯電話用にホームページを振り分けてくれるサービスがあります。
面倒なら使用してみてはどうでしょうか。

by odring lab

参考URL:http://odring.com/gw/
    • good
    • 0

回答ではありませんがどうかご覧下さい。



アクセスの判別については下の方の通りで問題ないと思います。
(私も自分のサイトで同じ判別を行っています。)

しかし、できればauのEZwebも入れるようにしていただけませんか?(^^;
EZwebではHDMLしかブラウズしないように思われていますが、
i-mode対応のサイトのCHTML程度であれば
サーバのトランスレーター機能により(ある程度)表示可能です。

以下、参考までに判別ルーチンです。

($mob{car},$mob{ver},$mob{mod}) = split(/\//,$ENV{'HTTP_USER_AGENT'});
if ($mob{car} eq 'J-PHONE') {
# J-phon eの処理
} elsif ($mob{car} eq 'DoCoMo') {
# DoCoMo の処理
} elsif ($mob{car} eq 'UP.Browser') {
# EZ-web の処理
} elsif ($mob{car} eq 'ASTEL') {
# ASTEL(.i) の処理
}
    • good
    • 0

他の方が、書かれているとおり、アクセスがあったときに


環境変数 HTTP_USER_AGENT をチェックすれば
いいと思います.

HTTP_USER_AGENT の中身は

+ i-mode の場合
DoCoMo/1.0/P209i/c10
DoCoMo/HTTP Ver./機種名/キャッシュ

+ J-Sky の場合
J-PHONE/2.0/J-SH03
J-PHONE/ブラウザ Ver./機種名

というような値が入っています.(多分)

以下、自信がない判定ルーチン.(_o_)

-->-->
# HTTP_USER_AGENT の取得
$AGENT=$ENV{'HTTP_USER_AGENT'};
if ($AGENT =~ /^DoCoMo/ || $AGENT=~ /^J-PHONE/)
{
# OK
# DoCoMo 用メッセージ
# J-PHONE 用メッセージ
}
else
{
# NG
# 「携帯からアクセスしてね.」
}
<--<--

もっと厳密(?)にアクセス制限をするのであれば
IP アドレスから判断する方法もありますね.
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます!

おおぉ~、ルーチンまでご丁寧に書いて下さいまして本当に感謝です!

とても分かりやすい回答に大変満足しております。
ありがとうございました。

お礼日時:2001/02/14 22:52

どの携帯がどんなエージェント返すかわからない場合は、とりあえず Mozilla ってのをはじけばOKでしょう。


これでNetscapeとなぜかIE(笑)もはじけます。つまりほぼ90%近くのPCブラウザをはじける事になります。

i-modeの場合はDoCoMoってキーワードを探せば良いと思うんですが、他は判りません。
とりあえず暫くログを取ってみて、どんなユーザエージェントが来るか傾向と対策を練ってみるのはいかがでしょう?

あとは「HTTP_USER_AGENT」で検索すれば、色々情報が出てくるでしょうね。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます!

そうですね!
Mozillaではじいてもいいですね。
参考になります。

あと、「HTTP_USER_AGENT」で検索も早速やってみます。

ありがとうございました。

お礼日時:2001/02/14 22:44

サーバ側で端末の環境変数を取得してその中のユーザエージェントで


i-MODEやJ-SKYは判断できると思います。

HTTP_USER_AGENT

に文字列で入りますのでそれで判断。
それ以外でのアクセスの場合に条件分岐させてエラー画面を出せばOK。
    • good
    • 0
この回答へのお礼

ご返事遅れましてすいません。

アドバイスありがとうございます!

HTTP_USER_AGENTですね。了解しました(^^ゞ
まだ私自身、CGI(perl)に関しては、他の方のスクリプトの改造程度しかできませんで、、知識がまったく足りないのです(^^;;

ありがとうございました。

お礼日時:2001/02/14 22:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qperlでアクセス端末の解像度を知りたい

アクセス元の端末(たとえばスマホなのかPCなのか)で表示する画像を変えたいため、アクセス端末の解像度を取得したいのですがどうすればよいでしょうか?
いろいろ探してみたのですが、javascriptばかりヒットし、use Term::ReadKeyというものも出てきたのですが、その参考ページをそっくり入れてみても動作しません。

sub agent{
%agent_type = (
qr/MSIE/i => 'p',
qr/iPhone/ => 's',
qr/iPad/ => 't',
qr/Android/ => 's',
一部省略
);
}

sub browser{
&agent;
my $ua = $ENV{'HTTP_USER_AGENT'};
foreach my $key(keys %agent_type){
if ($ua =~ $key){
$ua_type = $agent_type{$key};
last;
}
}
}

上記のような環境変数で振り分けることも考えたのですが、Androidだとスマホとタブレットと解像度が大きく違うものでも同じものをはき出してしまうかと思い、正確な振り分けができず困っています。

どうかperlだけで解決できる方法がありましたらぜひ教えてください。
よろしくお願いします。

アクセス元の端末(たとえばスマホなのかPCなのか)で表示する画像を変えたいため、アクセス端末の解像度を取得したいのですがどうすればよいでしょうか?
いろいろ探してみたのですが、javascriptばかりヒットし、use Term::ReadKeyというものも出てきたのですが、その参考ページをそっくり入れてみても動作しません。

sub agent{
%agent_type = (
qr/MSIE/i => 'p',
qr/iPhone/ => 's',
qr/iPad/ => 't',
qr/Android/ => 's',
一部省略
);
}

sub browser{
&agent;
my $ua = $ENV{'HTTP_USER_AGENT'};
foreac...続きを読む

Aベストアンサー

Mobile::UserAgentは古すぎか。。。
HTTP::MobileAgentのdisplayメソッドを使えば、多少ましでしょうが、
HTTP::MobileAgentは2012年が最新なのでどちらにしろ完璧な解像度を得るのは
不可能でしょう。

QPerlにおけるのようなPerlのバージョンなどのチェック機能はございますか?

 Perlにおける<?phpinfo();?>のようなPerlのバージョンなどのチェック機能はございますか?
利用しているサーバのPerlの正確なバージョン(5.8.1など。5.8までではなく)やインストールされているモジュールなどが知りたいので。

Aベストアンサー

1行目のパスにコマンドを追加してもエラーが返るだけなので、

print "Content-type: text/plain\n\n";
print `perl -v`;
print `perl -V`;
print `find \`perl -e 'print "@INC"'\` -name '*.pm' -print`;

のように、コマンドをバッククォートで括ってprintさせれば出力されます。

QPerlを端末で使う

以前よりCGIでPerlをよく利用していたのですが、現在サーバーの保守や管理で簡単なシェルを使う機会が多くなりました。しかし、シェルスクリプトになるとちょっと難しくて勉強する時間がなくできるだけPerlでいろいろな処理をしたと思っています。
 質問は、PerlをGnome端末などから操作するにはどうしたらよいのでしょうか?いくつかの処理をPerlで書いて
$ perl -w /home/tinte/test_perl.pl
みたいな感じで処理はできますが、シェルのように絶対パスではなくコマンドをそのまま記述することは可能でしょうか?例えば上記の処理を
$ perl -w test_perl.pl
のような感じで短縮できればよいなと思っています。どこかにリンクを貼ったり設定を変えればできそうな気がしていますが、もしわかる方がいましたらおしえてください。
またPerlのコマンドをそのまま端末で使うことはできないのでしょうか?
周囲にわかる人間が全くいないのでいろいろヒントをもらえるとうれしいです。よろしくお願いします。

Aベストアンサー

test_perl.pl が PATH 上にあるなら、Perlの種類によっては

perl -S test_perl.pl

で起動できると思います。


同じくPATH上にあって、実行パーミッションがあって、test_perl.pl の 1行目に以下が書いてあれば、 シェルスクリプトと同様に test_perl.pl をコマンド名として使用できると思います。

#! /usr/bin/perl

(/usr/bin/perl は環境依存です)

QPerlスクリプトでメールを作成して送信

できるでしょうか?
ニフティプロバイダを使ってますがCGI制限があり
SMTPはできないそうです

Aベストアンサー

Perlスクリプトでも不可能ではないでしょうが、
メールの仕組みを理解していなければ無理でしょう。
(それ以外の問題もあります)

この場合、sendmailというのを利用するのが簡単なのですが、
niftyではsendmailが利用出来ません。
CGI制限の関係で無理かも知れないですね。

Qperlスクリプト $1 qq などについて。

以下のスクリプトについて質問があります。


$_ = $mail;
m/(^[a-zA-Z0-9\.\_\-]+\@[a-zA-Z0-9\.\_\-]+)/g;
$mail = $1;
if($in{mail} ne $mail){ &PrintError('メールアドレスは、半角文字で書いてください。'); }


このスクリプトなのですが、$mailの値を$_に代入し、$_の値をm/・・・ の部分で半角チェックしているのは分かるのですが、半角チェックされた後どうなっているのかがわかりません。また、$1 とはどうゆう意味なのでしょうか??ifより後の部分は分かっています。

また、

open(IN, "<database.dat");
while (<IN>) {
print;
}
close(IN);

の全体的な説明をお願いしたいです。ファイルハンドルという概念とopen,close両関数は分かっています。


最後に

print qq(Content-type: text/html; charset=Shift_JIS\n\n);

とあった場合の qq の意味が分かりません。

分かる方いらっしゃいましたらご教授くださると幸いです。よろしくお願いします。

以下のスクリプトについて質問があります。


$_ = $mail;
m/(^[a-zA-Z0-9\.\_\-]+\@[a-zA-Z0-9\.\_\-]+)/g;
$mail = $1;
if($in{mail} ne $mail){ &PrintError('メールアドレスは、半角文字で書いてください。'); }


このスクリプトなのですが、$mailの値を$_に代入し、$_の値をm/・・・ の部分で半角チェックしているのは分かるのですが、半角チェックされた後どうなっているのかがわかりません。また、$1 とはどうゆう意味なのでしょうか??ifより後の部分は分かっています。

また、

open(IN,...続きを読む

Aベストアンサー

>$1 とはどうゆう意味なのでしょうか?
その前のマッチングで( )でマッチした部分

>全体的な説明
"database.dat"
を一行毎読み出し、標準出力に表示します。
print;
は、
print $_;
と同じで、この場合の$_ は、<IN> で読み込まれた一行

>qq
qq( 中身 ) は、関数呼出(形?)による
"中身" とほぼ同じ


このカテゴリの人気Q&Aランキング

おすすめ情報