アプリ版:「スタンプのみでお礼する」機能のリリースについて

初めまして。
私は今までWebサイトは構築したことがありましたが、今回携帯サイトを初めて構築することになりました。

htmlで順調に構築してまいりましたが、会員登録ページなどのユーザからの入力データを受け取る部分はCGIで対応しようと思いました。
しかし、シュミレータで動作確認を行ったところ、docomo以外は対応していないと表示され、非常に困っています。
docomoでは正常にデータが受け取れているのでプログラムは正しいと思います。

いろいろ調べた結果、「CGIは3キャリア対応している」と私は解釈したのですが、実際はどうなのでしょうか?
”~.cgi”というファイルを閲覧可能なキャリアはdocomoだけなのでしょうか?
なにぶん初心者なため、質問内容が初歩的なものとなってしまっているかもしれませんが、ご回答宜しくお願い致します。


なお、使用したシュミレータは以下のとおりです。
docomo:i-mode HTML Simulator II
softbank:ウェブコンテンツヴューア
au:Openwave SDK 6.2K

A 回答 (15件中1~10件)

ウェブでの通信手順 HTTP について誤解があります。

まずは入門書で HTTP を勉強するところからはじめるのがいいです。
お勧め: 上野 宣 (著) 「今夜わかるHTTP」
http://www.amazon.co.jp/%E4%BB%8A%E5%A4%9C%E3%82 …

誤解の一番重要なところを説明します。

ウェブは
http://..../~.cgi のデータをください」
「<html>
...

と、サーバはデータだけ送っているものだと思っていませんか?

実際の動作は
http://..../~.cgi のデータをください」
「OK です。
 ファイルの内容は text/html です
 ファイルのサイズは xxxxx bytes です
 最終更新日時は ..... です
 (一行空白を置いて)
 <html>
...

という動作をしています。その URL のデータについての情報がデータ本体の前に送信されています。これを「HTTP レスポンスヘッダ」と呼びます。PC のブラウザ(IE, Firefox, Opera, Safari, etc)でもデフォルト状態では表示されませんが、確かにありますし、実は重要です。

先ほどの例で「ファイルの内容は text/html です」という項目を入れました。ウェブでのファイルの種類の区別は本来は HTTP レスポンスヘッダで行うものなんです。例えば「ファイルの内容は text/plain です」と書いてしまうと拡張子が .cgi でも .html でもプレインテキストとして扱う -HTML のつもりがソースコードが表示される- のが本来の規定です。

> ”~.cgi”というファイルを閲覧可能なキャリアはdocomoだけなのでしょうか?
”~.cgi” という名前はクライアントには関係ないんです。

.html や .gif を送るときには管理者は気にしません。ウェブサーバが自動でファイルの種類の行を作るからです。拡張子が問題になるのは、ほとんどのウェブサーバが HTTP レスポンスヘッダを作るときに参照しているからです。

しかし CGI の場合はプログラマが自分で HTTP レスポンスヘッダのファイルの種類の行を作らなければなりません。CGI は HTML, GIF, JPEG, PNG, TXT, etc のどれでも作成できるので、ウェブサーバが自動でファイルの種類の行を作ることができないからです。

PC 向けではうまくいったしれません。IE は HTTP レスポンスヘッダのファイルの種類の行を見ない、しかも拡張子も見ない、実はデータの内容を調べて処理している(例えば <html> が見つかったら HTML として表示する)、ことを Microsoft がドキュメントで説明しています。試しに HTML を拡張子 .txt でウェブサーバにおいて IE で表示させてみてください。HTML として表示されるはずです。後は .gif でも .jpg でも .swf でも何でもいいです。デフォルト設定の IE ではなんだろうと HTML として表示します。(IE 6 以降は設定で変えられます)

HTTP レスポンスヘッダを見るには、ツールを持っているサイトを使うか、自分でツールをインストールするか、です。

私が知っているのは
View HTTP Request and Response Header
http://web-sniffer.net/
# サイトの URL を入力すると HTTP レスポンスヘッダも含めて表示されます
Live HTTP headers
http://firefox.geckodev.org/index.php?cmd=read&p …
# Firefox の機能拡張です

自分で確かめてくださるようお願いします。
    • good
    • 0
この回答へのお礼

kmihara様。
分かりやすい説明ありがとうございます。
CGIに関してご指摘のとおり完全に誤解していました。
入門書で勉強してみようと思います。

HTTP レスポンスヘッダに関しても、漠然としたイメージは出来ました。
IEは自動で解釈しているんですね・・・
ということは、携帯ではHTTP レスポンスヘッダを正しく記述しないといけない・・・と。
そこで
>CGI の場合はプログラマが自分で HTTP レスポンスヘッダのファイルの種類の行を作らなければなりません。
とのことですが、
以下の行を
print "Content-type: text/html\n";
print "\n";
<html>タグの前に入れればいいと書かれていました。

しかし、実際入れると<body>タグ外にもかかわらず、ブラウザ上に
そのまま表示されてしまいます。
何故なのでしょうか?
記述方法が間違っているのでしょうか?

お礼日時:2007/02/21 15:13

五月雨式に書いてしまってすみません。



CGI でトラブルを起こしたときに確認するべきことが Apache HTTP サーバのマニュアルにまとめられていました。
http://httpd.apache.org/docs/2.0/ja/howto/cgi.ht …

順番に読んでいくと今は見出し「プログラムエラー」と見出し「エラーログ」の間ぐらいまで確認が済んでいます。

ウェブサーバのエラーログを読めるでしょうか。そもそもファイルを見られない状況だと、開発方法を考え直す必要があります。

それと、すみません。
先に書いた「"Content-type" の "type" を "Type" に直して」は無意味でした。上のドキュメントも "Content-type" のままですし、自分で Apache 2.2.4 (Linux 上でビルド・実行)でも問題ありませんでした。

参考URL:http://httpd.apache.org/docs/2.0/ja/howto/cgi.ht …
    • good
    • 0
この回答へのお礼

kmiharaさん


参考URL拝見しました。

>ウェブサーバのエラーログを読めるでしょうか。そもそもファイルを見られない状況だと、開発方法を考え直す必要があります。

エラーログは見ることは可能です。
しかし、実際見てみても特にエラーが出ているわけではないので
ログには残っていません。
実行時にエラーは出ず、単にHTTPレスポンスヘッダがブラウザ上に
表示されてしまうだけですので・・・



現在、CGIでの開発を一時中断して、ASPで進めています。
開発を始めたころ、ASPは携帯3キャリアに対応していないと
勘違いしてしまい、CGIでの開発を決めたのですが、シュミレータでの
動作確認がとれましたのでASPで進めることにしました。
今回はCGIでの開発は行わないかもしれませんが、将来的なことを
考えると、CGIを勉強したいという気持ちはあります。
kmiharaさんには本当にいろいろ教えて頂き感謝しています。
非常に中途半端ではありますが、今後も開発の合間合間にいろいろと
試してみようと思います。

お礼日時:2007/02/22 21:48

聞き忘れていたことがありました。



1. http://web-sniffer.net/ に CGI の URL を入力して試すと、どんな結果がでますか

ウェブサーバからクライアントに何が送られているのか確認できます。ただし、ウェブサーバに外部からアクセスできなければ試せません。

全部英語なので、読むところをあらかじめ決めます。
"HTTP Response Header" と書いてある表の "Content-Type" の行です。

例として
IE 7 で http://www.goo.ne.jp/ を表示させるときにウェブサーバが送っている内容を紹介します。
http://web-sniffer.net/?url=http%3A%2F%2Fwww.goo …

2. お使いのウェブサーバは何ですか?

Apache でしょうか、IIS でしょうか、他のサーバでしょうか。

参考URL:http://web-sniffer.net/
    • good
    • 0
この回答へのお礼

kmiharaさん
毎回、詳しく教えて頂きありがとうございます。


>-- 例 ここから --
>Content-Type:text/html;charset=Shift_JIS

><html>
>-- 例(以下略) ここまで --

上記の件、試してみました。
結果は、相変わらず画面上に
Content-Type:text/html;charset=Shift_JIS
と出力されてしまいます。


>1. http://web-sniffer.net/​ に CGI の URL を入力して試すと、どんな結果がでますか

すいません。
現在、ウェブサーバに外部からアクセスできないので試せません。


>2. お使いのウェブサーバは何ですか?

IISです。

お礼日時:2007/02/22 20:59

> ですが、こうなると画面上にHTTPレスポンスヘッダが、


> そのまま出力されてしまうのです・・・
> これを回避する方法などあるのでしょうか?
> それと余談ですが、こうした場合docomoでも動作しなくなって
> しまいます。

> Content-type:text/html;charset=Shift_JIS
> Content-Length:2610
>
> <html>
> <head>

いくつか試してくださいませんか

1. Content-Type は大文字・小文字も変えないで。"Type" は先頭の T が大文字です。

使い方を決めた文書に "Content-Type" と明記してあります。一文字も変えずに出力してみてください。

2. Content-Length は <html> ~ </html> までの長さなので、CGI を実行するごとに計算する必要があります。

以前のソースコードに
> "Content-Length:2610";
と固定で書いてあるのが気になります。CGI の出力の長さが変わるときには対応できません。

出力の長さがあらかじめ分からない場合は、データを一旦全部作ってから数えるしかありません。それまでに一文字も送ってはいけません。つまり

> print << "END_DOC";
> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
> <html>
> <head>
> <meta http-equiv="Content-Type" content="text/html; charset=SHIFT_JIS">
> <title>グルメガイドWEB-口コミ情報</title>
> </head>
> <body>
> ----ボディ本体----
> </body>
> </html>
> END_DOC

これを本番の CGI でやったらアウトなんです。配列のような文字列をつなげられる変数を用意して、HTML の内容を全部つなげて、バイト数を数えてから、Content-Length と HTML 本体を送る必要があります。

まず 1. の結果を見るほうがいいので、
1. を直すと同時に Content-Length をわざと出さないで、つまり

-- 例 ここから --
Content-Type:text/html;charset=Shift_JIS

<html>
-- 例(以下略) ここまで --

で試してくださいませんか。

1. がうまくいったら 2. を試す必要があります。そのときには、おそらくプログラムの大幅書き直しになると思います。

# 参考 URL の機能にようやく気付きました
# 信頼のおける、その代わり全部英語の、2ページを挙げます

参考URL:http://www.ietf.org/rfc/rfc2616.txt,http://www.g …
    • good
    • 0

> ----以下保存ファイル全文----


> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
> <html>

ここの前に、データ本体とひと続きになるように、HTTP レスポンスヘッダを出力するんです。あとはウェブサーバが HTTP レスポンスヘッダとデータ本体を(空行を頼りに)見分けてブラウザに送信します。

----修正後----
Content-Type: text/html; charset=Shift_JIS
Content-Length: xxxx

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
# 以下略
# Content-Length は正確に数えていないので伏字
# HTTP レスポンスヘッダと HTML の間は空行、SPACE も TAB も入れてはいけません
    • good
    • 0
この回答へのお礼

kmiharaさん

ありがとうございます。
実際、CGIの出力結果が以下のようになるよう訂正しました。
HTTPレスポンスヘッダとHTMLの間には、SPACEやTABなどは
入っていません。

ですが、こうなると画面上にHTTPレスポンスヘッダが、
そのまま出力されてしまうのです・・・
これを回避する方法などあるのでしょうか?
それと余談ですが、こうした場合docomoでも動作しなくなって
しまいます。



----修正後----
Content-type:text/html;charset=Shift_JIS
Content-Length:2610

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=SHIFT_JIS">
<title>グルメガイドWEB-口コミ情報</title>
</head>
<body>
----以下略----

お礼日時:2007/02/22 18:57

まず、CGI が実際に出力しているものを目で見るのがいいです。

気付いていないコードが何か出力している場合もあるので。

CGI ならサーバマシン上でコマンドとして実行できると思います。サーバマシンと似た OS と Perl がインストールされたマシン(できればサーバマシンそのものが良いです)にログインして実行できるでしょうか?

CGI を実行するときに、出力結果をファイルに残します。それをエディタで読みます。

CGI の実行(UNIX の場合)、出力結果をファイル output.txt に保存するとして
$ ./(お作りになった CGI).cgi > output.txt

保存したファイルの先頭に期待とは違う何か(いきなり空行とか、後で出力する予定のタグとか)が見つかれば、それを出力するコードがないかプログラムを見ます。

保存したファイルの先頭が期待通りの場合は、ここに貼り付けるなどの方法で、保存したファイルの先頭部分を他の人に見てもらうのがいいと思います。
    • good
    • 0
この回答へのお礼

kmiharaさん、こんにちわ。
仰るとおりCGIの出力結果を保存して確認してみました。
すると、期待通りのもので、特におかしい点は見つかりませんでした。

CGIの実行出力結果を以下に貼り付けます。


----以下保存ファイル全文----
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=SHIFT_JIS">
<title>グルメガイドWEB-口コミ情報</title>
</head>
<body>
<div align="center">
口コミ情報
<hr>
</div>

<br><img src="img/f97d.jpg"><a href="stor_reg.htm"><font size="2">ポイントカード会員登録</font></a>
<br><br><hr>
<br>
<img src="img/f8d0.jpg">
<br><br>
<hr>
<div align="center">
<font size="2" color="#FF6666">********</font>
</div>

<a href="how.htm"><font size="2" color="#FF0000">●</font><font size="2">ご利用案内</font></a>
<br>
<a href="company.htm"><font size="2" color="#FF0000">●</font><font size="2">会社概要</font></a>
<br>
<a href="mail.htm"><font size="2" color="#FF0000">●</font><font size="2">お問合せ</font></a>
<hr>

<a href="index_mb.html"><font size="2">HOME</font></a>

<hr>

<div align="center">
<font size="2">グルメガイドWEB</font>
</div>
</body>

</html>

お礼日時:2007/02/22 17:15

ごめんなさい。

大間違いがありました。

> 逆に言うと、
> 空行の前に出力したものはなんだろうと
> HTTP レスポンスヘッダとして送信されてしまいます。
> <html> を最初に出力してしまうと
> ブラウザには例えば <title> から始まってしまう
> 格好悪い HTML になってしまうので注意です。

ウェブサーバが、明らかに HTTP レスポンスヘッダではないと判断すると、独自判断でレスポンスヘッダを作って CGI の出力をデータ本体にすることがあります。その意味で注意です。

この回答への補足

ちなみに、ひとつ付け加えると・・・
CGIを読み込んだときの動作は以下のとおりです。


docomo:期待通りの(PCと同様の)画面表示
au:<html>以下のソースが画面に表示
  (このソースをHTMLとして読み込んで表示されると嬉しい)
softbank:拡張子".cgi"のリソースには対応していません と表示

補足日時:2007/02/22 11:42
    • good
    • 0
この回答へのお礼

kmiharaさん、お疲れ様です。
実際にプログラムを変更し、テストを行ったので報告します。

結果は変わらず(docomoシュミレータのみ読み込み可能)・・・
といった具合なのですが、以下にソースを載せます。

私の見解では、
始めの2行でHTTPレスポンスヘッダを送信。
補足:
print "Content-type: text/html; charset=Shift_JIS";
というようにprintを記述すると、ブラウザ上にそのまま
表示されてしまったため、printを取り除きました。

その後DB接続のためのソースを記述し、
print "\n";
を記述。
その後、HTML本体、といった具合です。
どこかおかしな点等、ございますでしょうか?



----以下、ソース----

"Content-type: text/html; charset=Shift_JIS";
"Content-Length:2610";

----DB接続設定の記述----

print "\n";
print << "END_DOC";
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=SHIFT_JIS">
<title>グルメガイドWEB-口コミ情報</title>
</head>
<body>
----ボディ本体----
</body>
</html>
END_DOC

お礼日時:2007/02/22 11:35

> 以下の行を


> print "Content-type: text/html\n";
> print "\n";
> <html>タグの前に入れればいいと書かれていました。
>
> しかし、実際入れると<body>タグ外にもかかわらず、ブラウザ上に
> そのまま表示されてしまいます。
> 何故なのでしょうか?
> 記述方法が間違っているのでしょうか?

print "Content-type: text/html\n"; の前に
空行(改行しかない行)を送るコード、つまり
print "\n"; がありませんか?

CGI を動かしたウェブサーバは、空行の前を HTTP レスポンスヘッダ、空行の後をデータ本体と認識して、ブラウザに送ります。CGI で空行を入れてしまうと、その後はなんだろうとデータ本体として送信されてしまいます。空行を出力していないか、しらみつぶしで調べてください。

逆に言うと、空行の前に出力したものはなんだろうと HTTP レスポンスヘッダとして送信されてしまいます。<html> を最初に出力してしまうとブラウザには例えば <title> から始まってしまう格好悪い HTML になってしまうので注意です。

さて、Content-Type: text/html の行を正しく送ったとして、課題が残っています。note_book さんも指摘なされた Content-Length です。これは「データ本体の長さ」です。例えば 2048 bytes ちょうどの HTML の場合、Content-Length も付けて HTTP レスポンスヘッダを送ると次のようになります。

Content-Type: text/html
Content-Length: 2048

DoCoMo/SoftBank は Content-Length を必ず送ることを要求します。au もオープンアプリ[Java]をダウンロードする際には要求します。Content-Length が無い場合は TCP/IP 接続を切ったときがデータの終わりなのですが、携帯電話会社はこれをやられるとプロキシサーバの負担が多いので、データの終わりが確実にわかるように要求しているのです。(正確には、「もう少し続く」「もう少し続く」「これで終わり」と教えながら送る方法もあるのですが、難しいので割愛します)

<html> から </html> まで作ってはじめてデータの長さがわかるのですが、その数字を <html> の前に出力しなければなりません。つまり <html> から </html> までをいったん溜めてデータ全体の長さ(念を押すと、文字数ではなく、バイト数です)を数えて HTTP レスポンスヘッダを出力した後に <html> から </html> までを出力しなければならないんです。

次に Content-Type の行でもっとうまくやる方法もひとつ紹介します。Shift_JIS の HTML だったらこう書いてしまえばいいんです。

Content-Type: text/html; charset=Shift_JIS

META タグで送った覚えはないでしょうか。HTTP レスポンスヘッダにも書ける、いや、本当は HTTP レスポンスヘッダがこれを書く場所なんです。

META タグを書くようになったのは、多くの人でウェブサーバを共用するときの都合のためです。例えば HTML ファイルを送るときにサーバで charset=Shift_JIS と付けてしまうと、EUC-JP/ISO-2022-JP/UTF-8 で HTML を書いた人はいつまでも文字化けのままになります。なので、サーバではわざと文字エンコードを指定せず、各人が META タグの中で書くことにしているのです(雑学:「本当は」を繰り返すと、実は HTTP レスポンスヘッダで文字エンコードを書かなかったときには charset=ISO-8859-1 でなければならないというルールもあるのですが、それを言い出すと日本のウェブサイトは壊滅的打撃を受けるので、みんなでそのルールは無かったことにしています)。

ですが CGI では Content-Type で何を送っても他人に迷惑をかけないので、文字エンコードも送ってしまえばいいんです。

さて、この後も携帯電話 3 キャリア対応となると課題は山積みです。例えば、DoCoMo と au と SoftBank のユーザがそれぞれ絵文字を書き込んだらどうしましょう。課題はたくさんあって、作る人が皆それぞれに悩んで、ネットに苦労の跡を記しています。まだまだ先は続きます。
    • good
    • 0
この回答へのお礼

kmiharaさん。

回答ありがとうございます。
大方の部分に関しては、おっしゃってる事が理解でき、
HTTPレスポンスヘッダについて非常に勉強になりました。
明日、プログラム変更の後、実際にテストしてみます。

お礼日時:2007/02/22 01:41

> しかし、実際手持ちのシュミレータで動作確認したところ、


> やはりdocomoしか動作しませんでした。

私が確認した限りでは動作しています。

OS:Win2000
使用したシミュレータ
docomo:i-mode HTML Simulator II Version1.0
softbank:ウェブコンテンツヴューア Version 5.0.1.126
au:Openwave SDK 6.2K Version 6.20.105.16

何かしらの設定がちがうのでしょうかねぇ。。。
通常のHTMLは閲覧できますか?
セキュリティーソフトが悪さをしていませんか?
    • good
    • 0
この回答へのお礼

私は
OS:WindowsXP

シュミレータのバージョンは同じでした。

設定ですか・・・
どこをどういじったらいいか全く分かりませんでした・・・

ちなみに通常のHTMLは閲覧できます。
セキュリティソフトに関しては会社のPCなので何とも分からないですね。

お礼日時:2007/02/16 18:25

> 差しさわりのない範囲でソースを貼り付けていただけると嬉しいです。



こちらの日記を試してみてください。
http://mawashimono.com/web/dlcgi/nik/nik.cgi
シミュレーターでの動作は確認しています。(SoftBank以外)
    • good
    • 0
この回答へのお礼

ありがとうございます。
しかし、実際手持ちのシュミレータで動作確認したところ、
やはりdocomoしか動作しませんでした。

手持ちのシュミレータが対応していないということなのでしょうか?


なお、使用したシュミレータは以下のとおりです。
docomo:i-mode HTML Simulator II
softbank:ウェブコンテンツヴューア
au:Openwave SDK 6.2K

お礼日時:2007/02/15 20:38

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