このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

iモード対応ページの振り分け

発言者:タマップ
( Date Monday, September 10, 2001 13:17:06 )


こんにちは。
iモード用のページというのは、どうやってiモード端末からのアクセスというのを調べて表示させているのでしょうか?サーバー側で何かやっているのでしょうか?JavaScriptは使えないし。
以前、Macを使用したサーバーなら「WebStar」を使えば可能というお話を聞いたのですが。
御存じの方、どんな些細なことでも良いのでお教え下さい。よろしくお願いいたします。

田中求之 さんからのコメント
( Monday, September 10, 2001 15:19:26 )

CGI などを使えば、携帯からのアクセスかどうかはわかりますので、それを
もとにページを切り替えたり、データの変換を行うわけです。

サーバは別に WebSTAR でなくてもかまいません。CGI を普通にサポートしている
サーバであれば、CGI を作れば、ページ切り替えは可能です。

松本 さんからのコメント
( Monday, September 10, 2001 17:36:48 )

iモード対応HTMLのユーザエージェント機能を使うことにより、CGIにより
必要なヘッダを取得することでアクセスしてきた端末機種まで特定する
ことができるとのことです。
詳しくはドコモのオフィシャルぺージに掲載されていますのでご覧になって
ください。

→  http://www.nttdocomo.co.jp/i/tag.html

東谷 さんからのコメント
( Monday, September 10, 2001 17:52:23 )

私の知人は<NOFRAMES>を利用しているみたいです
iモードは当然フレーム未対応なので
同じURLで両方対応できる
お手軽な方法ですが、なかなか賢いかも

Junnama さんからのコメント
( Monday, September 10, 2001 21:25:13 )

DoCoMoのドキュメントによると"DoCoMo/1.0/KO210i"みたいなヘッダーを
送ってくるので、AppleScriptなら

on handle CGI request from browser user_agent
if user_agent begins with "DoCoMo/" then
--imodeページ
else
--通常のページ
end if

のようにして、Redirectで割り振ってやればいけると思います。

寺港みやび さんからのコメント
( Tuesday, September 11, 2001 08:38:16 )

端末のドメインがdocomo.ne.jp.を含むかどうかも判断に入れると
なりすましを除外できます。

松本 さんからのコメント
( Tuesday, September 11, 2001 11:41:52 )

うまくいかないのですが、どこか間違いがありますでしょうか?
ご指摘下さい。
--
property crlf : (ASCII character 13) & (ASCII character 10)
property thhp_10_header : "HTTP/1.0 200 OK" & crlf ツ
    & "Server:MacHTTP"& crlf ツ
    &"MIME-Version:1.0" & crlf ツ
    &"Content-type text/html" & crlf
 property http_content_length : "Content-length:"
 
 ---CG駆動用のAppleEvetのハンドラ
 
 on handle CGI request with posted data post_args using access method method from address client_address ツ
     from uer_name using password password with user info from_user
     from server server_name via port servr_port executing by script_name of content type content_type referred by referer ツ
     from  browser user_agent of action type action from client IP address client_ip
     
     if user_agent does not contain "DoCoMo" then
         set FileRefNum to open for access file ":index.file" ---普通のファイルを読み込む
         set theData to (read FileRefNum)
         close access FileRefNum
    else
        set FileRefNum open for access file ":index.file" ---携帯用ファイルを読み込む
        set theData to (read FileRefNum)
        close access FileRefNum
    else if
    
    set clen to (lenght of theData) + (length of http_10_header) + (henght of http_content_length) + 4
    return thhp_10_header & http_content_hength & clen & crlf & crlf ツ
             & theData
             
 end handle CGI request

田中求之 さんからのコメント
( Tuesday, September 11, 2001 14:24:47 )

うまくいかないというのは

1: CGI がそもそも動かない
2: Docomo との切り替えがうまくいかない

のどちらでしょうか?

スクリプトを見るかぎり、もしこれが CGI のスクリプトのそのままのコピー
なのでしたら、うまく動かないと思います。

set clen to (lenght of theData) + (length of http_10_header) + (henght of http_content_length) + 4

の行に、まずタイプミスがあること(lenght になってます)、それと、こちらの
方が重要なのですが、AppleScript の length は、文字数を数えるものであって、
データの容量を量るものではありません。このため、日本語などの2バイト
文字を含むデータの length は、データのバイト数になりません。
ですから、length で計ったものを Content-length ヘッダに渡すことは
できません。

さらに、Content-length は、HTTP ヘッダの分を含みません。ですから、

(length of http_10_header) + (henght of http_content_length) + 4

は余分です。

松本 さんからのコメント
( Tuesday, September 11, 2001 14:40:17 )

説明不足で申し訳ございません...(^^;

>のどちらでしょうか?
どちらにも至っておりません。その手前です。

 on handle CGIの下の行にfromが3行続きますが、一番始めのfromが
構文チェックでハイライトされます。
どこか間違っているとこうなるのですか?

NIKKEI MAC Sep.2000
「USER_AGENTを判別して、異なるWebページを返すAppleSprictのCGI」
と言うのをそのままタイプしました。

田中求之 さんからのコメント
( Tuesday, September 11, 2001 14:46:11 )

とりあえず、基本的な動作原理だけを組み込んだスクリプトです。
Tanaka's osax 2.01 を使用しています。携帯で切り替わることは
確認済みです。

property crlf : (ASCII character 13) & (ASCII character 10)

on handle CGI request from browser user_agent
  
  if "DoCoMo" is in user_agent then
    set myMsgs to "<HTML><TITILE>Hi</TITLE>携帯からのアクセスやね?</HTML>"
  else
    set myMsgs to "<HTML><TITLE>Hi</TITLE><H1>こんにちわ</H1></HTML>"
  end if
  
  set myLength to MT Byte Length myMsgs
  
  return "HTTP/1.0 200 OK" & crlf ツ
    & "Content-type text/html" & crlf ツ
    & "Content-length: " & (myLength as string) & crlf ツ
    & crlf ツ
    & myMsgs
  
end handle CGI request

田中求之 さんからのコメント
( Tuesday, September 11, 2001 14:47:31 )

>構文チェックでハイライトされます

その前の行末にソフト・リターン(option + return)を入力し忘れています。

松本 さんからのコメント
( Tuesday, September 11, 2001 15:04:45 )

具体的に答えを示して頂き、恐縮です。
田中先生のsprictを実行専用で保存しようとすると、

  return "HTTP/1.0 200 OK" & crlf

がハイライトされますが、これはどうしてでしょうか?

田中求之 さんからのコメント
( Tuesday, September 11, 2001 15:08:15 )

このページのスクリプトの場合、crlf の後に半角カタカナでツという文字が
入っていますが、これは option + return で入力する文字です。この文字の
入力を忘れているのだと思います。

(ブラウザ上でスクリプトをコピーし、それをスクリプト編集プログラムに
ペーストすれば、うまくいきますよ)

松本 さんからのコメント
( Tuesday, September 11, 2001 15:22:17 )

うまくいきました。(^^)

これをtest.acgiとして実行専用で保存し、WebSTARのrootにおけばよろしい
ですか?
この作業だけを行うと、「Error. Unable to launch ACGI application. 」
となります。何か他に設定が必要なのでしょうか?

私が投稿した場所ではないのに、どんどん質問しちゃってすみません。

田中求之 さんからのコメント
( Tuesday, September 11, 2001 15:26:50 )

まずスクリプトの保存方法は間違っていませんか?

アプリケーション形式で、かつ「実行後に自動終了しない」というオプショ
ンを必ずチェックしてセーブする必要があります。


また、WebSTAR の設定で cgi の起動の制限(cgi-bin フォルダーの中に入っている
ものしか利用できないようにする)という設定になっていた場合には、root に
おいても使用できません。その場合は、WebSTAR の設定を変更するか、cgi-bin
に入れて呼びだすようにしてください。

制限を設けていない場合には、

田中求之 さんからのコメント
( Tuesday, September 11, 2001 15:28:17 )

あ、途中で途切れちゃった (^_^;;

制限を設けていない場合には、スクリプトの保存方法さえ間違っていなければ、
root だろうがどこにおいても、ちゃんと実行できます。

松本 さんからのコメント
( Tuesday, September 11, 2001 15:47:56 )

cgi-bin入れると、うまく動作しました。

1、URLをwww.bbb.com/cgi-bin/test.acgiではなく、
 www.bbb.com/で動作する様にするにはcgi-binフォルダーに入っていない
 ものでも許可する設定をすればイイですか?(WebSTAR Admin)

2、携帯とパソコンとそれぞれ別のhtml書類へ飛ばすには、どういう設定が
 ありますか?
(NIKKEI MACの方を使う様になりますか?田中先生のものでも可能ですか?)

田中求之 さんからのコメント
( Tuesday, September 11, 2001 16:01:20 )

1については試されたらすぐにわかります。

2については、色々な方法があります。CGI のプログラミングのスキル次第
です。いろいろと調べたり試したりして、ご自分で納得のいく方法を見つけて
ください。

サードパーティの Plugin を使って、ページのディレクトリ(フォルダ)を
切り替えるという方法も使えるでしょう。

松本 さんからのコメント
( Tuesday, September 11, 2001 16:16:51 )

有難うございます。やってみます。

寺港みやび さんからのコメント
( Friday, September 14, 2001 13:13:54 )

例えばSSIスクリプトでやってしまう方法もあります。

<!--#hide -->
<!--#show var="HTTP_USER_AGENT" operator="con" val="DoCoMo" -->
<HTML>
<title>i-mode版</title>
ようこそxxxxへ!<br>
<a href="http://xxxxxxxx">[Enter]</a><br>
</HTML>
<!--#show-->