- ベストアンサー
フォームと直リンについて
- 初心者でも安心!フォームの使い方とダウンロードの仕組みを解説します
- CGIやhtaccessを使ってセキュリティ対策もばっちり!
- 音楽配信ページでユーザーの情報を収集し、ダウンロードをスムーズに
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>実際、サーバ側にあって、外部からの要求に応じて内部アクセス可能なプログラムの仕組みはどうなっているのでしょうか? サーバーサイド、クライアントサイドという言葉を聞いたことがあると思いますが、 これは、前者のサーバーサイド絡みの内容なので、サーバーマシンのOSとWebサーバ プログラムに依存します。 一般に、クライアントがWebサーバにあるsample.htmlを閲覧したい、という要求を http://www.hoge.com/sample.html としてアクセスをします。 sample.htmlがプレーンなHTMLで書かれたファイルであれば、そのままクライアント に送信します。 しかし、sample.htmlにcounter.cgiプログラムへのリンクがなされている場合 (アクセスカウンタ等)は、そのcounter.cgiの記述してある行(正しくはそうではない) までは、そのまま送信し、counter.cgiの行で再度サーバーに送信の要求がなされます。 その際、counter.cgiが、count.fixなるファイルを読み出しそこに123と記述してあったら、 それを124に書き換えてクライアントへ124と送信するのが、アクセスカウンタの原理です。 つまり、counter.cgiはサーバーサイドで稼動するプログラムというわけです。 そして、counter.cgiがアクセス可能なファイルであれば、サーバ内の何処のファイルでも アクセスが可能になります。 今回のケースの場合は、MP3のファイルをダウンロードしてくれる方のある程度の情報を 保存するということですので、それらをデータベースで管理した方が後々管理が楽に なると思います。 そういう意味では、cgiよりもPHPがお勧めです。 当然、大規模になる場合は、Javaの方が良くなります。
その他の回答 (5)
- net_lander
- ベストアンサー率49% (40/81)
先に、 4.直リンクについて の回答をします。 一般的なWebServerマシンのディレクトリ構成を例に示したいと思います。 /var/www/html/*** /home/User/public_html/*** 仮に、ターゲットとなるWebServerのURLを、http://www.sample.com とします。 一般的には、上のURLで参照されるファイルは、/var/www/html/*** の***の部分のファイルです。 つまり、http://www.sample.com/test1.html は、/var/www/html/test1.html をクライアントに送信しています。 次に、Userというユーザのtest2.htmlファイルを http://www.sample.com/~User/test2.html でアクセスできる場合、 /home/User/public_html/test2.html を参照しています。 この場合外部からは、/home/User/public_html/以下のファイル以外には、アクセスができません。 しかし、部分的に制限を加えたいディレクトリに.htaccessファイルを置きます。 そこで、、/home/User/MP3/sample.mp3 というファイルを置いた場合、サーバの内部からでないとsample.mp3にはアクセスができません。 その内部でアクセスできるプログラムの代表例がCGIプログラムです。 (MP3というディレクトリは、public_htmlを同列にあるため、 上位のUserディレクトリまで上がれないとMP3ディレクトリ にはアクセスができません。 外部からは、public_htmlよりに上位にはアクセスができないので、直リンクができない。という仕組です。) 言い換えると、サーバ側にあって、外部からの要求に応じて内部アクセス可能なプログラムを経由させれば、sample.mp3にアクセスできる。というわけです。
補足
毎回ありがとうございます! 仕組みがわかりました。 実際、サーバ側にあって、外部からの要求に応じて内部アクセス可能なプログラムの仕組みはどうなっているのでしょうか?もしよろしければ、この間の疑問とあわせて、またお暇なときにお答えいただけるとうれしいです! では、よろしくお願いします!
- net_lander
- ベストアンサー率49% (40/81)
疑問点がはっきりしましたね。 確認が容易な順に片づけましょう。 3.フォームを含むhtmlの次に飛ぶthanks.html について すでにアップされたSampleコードの場合 <form action="" method="post" name="price" id="price" onSubmit="MM_validateForm('金額','','R','名前','','R','Eメールアドレス','','RisEmail');return document.MM_returnValue"> を <form action="THANK.html" method="post" name="price" id="price" onSubmit="MM_validateForm('金額','','R','名前','','R','Eメールアドレス','','RisEmail');return document.MM_returnValue"> とします。 実際には、*.cgiとするわけです。 適当な、THANK.htmlを作成し、今現在お使いのwebサーバにアップしてお確かめください。 当然、データの取得、保存はできません。 ところで今日、スキー旅行に行きます。明日には帰ってきますが、続きは、明日以降にしたいと思います。
補足
せっかく解説していただいていたのになかなか話せなくて本当にすみません。ラップトップコンピュータが壊れてしまい、学校のPCから書き込んでいます。thank.htmlの表示の仕方がわかりました。ほんとうにありがとうございます! ずうずうしいのですが、もしよろしければ、前回の補足のその他の疑問点に関してもお暇なときに教えていただければ幸いです。 毎回の丁寧な解説に本当に感謝しています。
- net_lander
- ベストアンサー率49% (40/81)
うーん、焦る気持ちはわかりますが、疑問点を順番に潰していきませんか? 現在、私が把握しているあなたの疑問点は次の2つだと理解しています。 1.自動ダウンロードさせる仕組 2.フォームで送信されたデータの取得と保存 基本的に、この2つは別々のメソッドで行います。 1だけなら、No.2で書いた、i)で実現できます。 しかし、データの受信と保存、(メールの送信)は、htmlファイルだけでは、無理です。 まず、上の順番に勘所をつかんでいきませんか?
補足
親切に教えてくださって本当に感謝しています! そうですね、焦る前にどこがわからないのかを整理していきたいです。今のところ思いつくだけで4点ほど問題がありましたが、1は解決できたと思います。 1、自動ダウンロードさせる仕組み →ANo.3で教えていただいたものを参照し、実験してみて理解できました。ありがとうございます。 2、フォームで送信されたデータの取得と保存 →実際にサーバーにアップしたことなどがないため、どのように取得し、保存するのかの具体的なイメージがわいていません。ドリームウィーバーの入門書を見て、メールでデータを取得する方法はわかったのですが、ネットで調べていると、CGIを使ったほうが、より高度なデータ処理が可能になるということが書いてありました。しかしCGIを使ってフォームの内容を取得し、保存しようとするにはWEBサーバーがCGIの利用を許可している必要があり、WEBサーバーに問い合わせてそれに合わせて作成しなければいけないということもわかりました。今わからないのがWEBサーバーの情報を参照する以前にどこまで自分でフォームを作っておけるのか、またどのように作るのかということだと思います。具体的には、~.cgiや~.plが果たす役割などがよくわからないです。 また、CGIを使って作ったフォームなどはwebサーバ(アパッチ??)かなにかをダウンロードしないと自分のパソコンでは試すことができないと友人に聞いて、そこも不確かです。 3.フォームを含むhtmlの次に飛ぶthanks.html CGIでフォームを作ろうと思ったきっかけの一つとして、メールでフォームのデータを取得、保存するのを試した際に、送信ボタンを押した後、tanks.htmlへ飛ばす方法がよくわからなかったからです。そもそも送信ボタンにはアンカータグなどはないのにどうしthanks.htmlに飛ぶようになっているのかが疑問です。送信ボタンを押した後にthanks.htmlに飛ばすのはCGIでコントロールしているのではないかと、勝手に予想しています。さきほど理解していないといっていた、~.cgiまたは~.plにその具体的な指示が書いてあるのでしょうか? 4.直リンクについて webルートというものがよくわかりません。ルートという言葉自体は調べて「Windows NT系OSではAdministratorアカウントがrootに相当する。」のようなことを読んだのですが、webルートとはwebサーバーにあるルートのことなのでしょうか? お暇な時に答えていただけたらうれしいです。よろしくお願いします!
- net_lander
- ベストアンサー率49% (40/81)
Q1.>であれば、技術的に簡単になり、htaccessでの直リン防止をダウンロード先、またお礼画面にほどこすことができるのでしょうか? A1.できます。そんなに難しくはありません。CGIを使わなくともできます。Q2.の回答と合わせて回答します。 Q2.>なぜ、送信ボタンを押すとすぐにダウンロードが始まるようにしようと思ったのかというと、CGIを使ってフォームの内容を回収する場合、フォームの送信ボタンを押した後に、どのようなページに飛ぶのかということがよくわからないということがありました。htmlで送信ボタンを押した後に飛ぶ先を指定できるのでしょうか? A2. 【予備知識編】 フォームによりデータを送信する方法は、GETとPOSTの2通りありますが、GETには送信データの長さの制限があります。(IEの場合、URLを含め2083文字まで) 動作の違いは、下の【参考URL:】を参照してください。 【ソリューション編】 i)CGIを用いない場合(POST.htmlのデータは残らない) (動作の確認として試してみてください。Perl等のCGIを稼動させると失敗した場合の切り分けが複雑になります) POST.html→THANK.html→SONG.ZIP(MP3) 以下サンプルをアップしますので、動作を確認してください。(簡単なhtmlファイルなので、秀丸等のエディタで作成してください。) a)POST.html(単なるリンクを張っただけ) <a href="THANK.html">to THANK.html</a> b)THANK.html(メッセージを5秒間表示後自動的にSONG.ZIPをダウンロードします) <head> <meta http-equiv="Refresh" Content="5;URL=SONG.ZIP"> </head> <p> アクセスありがとうございます.<br> 間もなくダウンロードが開始されます。 </p> ii)CGIを用いた場合(送信データは、cgiから書き込んでください。) 上の*.htmlをすべて、*.cgiとして動作できます。 ◎ポイント 自動的にダウンロードさせる部分は、上記の<META>タグ以外に、Locationヘッダの送信によっても可能です。 .htaccessによって、リダイレクトすることもかのうですが、曲目の変更がダイナミックにできません。 ※この場合もwebルート以下にターゲットになるZIPファイルを置いた場合は、2度目以降の直リンクを防げません。webルートの上にターゲットとなるファイルを保管してください。こうすれば、直リンクが不可能になります。 【お奨め】 Perlによるcgiよりも、PHP+PostgreSQLの組み合わせの方が、送信されたデータの管理やレスポンスがクイックになります。 また、送信フォームを含んだページとメッセージ+ダウンロードページを分けると直リンクの危険がありますので、これらを一つのファイルで作ると良いです。 つまり、一つのPHP,CGIを再帰的に呼び出すということです。 イメージとしては、送信フォームと受信のルーチン+自動ダウンロードのすべてを一つのPHPかPerlでコーディングします。
補足
詳しく解説してくださり本当にありがとうございます!「POST.html→THANK.html→SONG.ZIP」の「POST.html→THANK.html」のところなんですが、フォームがあるPOST.htmlページの送信ボタンを押した際に、フォームの内容を受け取りつつ、次のTHANK.htmlにジャンプする仕組みがよくわかりません。ソリューション1では、フォームに記入された内容は得ることができないということですよね? 送信を押したら、フォームの内容を受け取り、指定したhtmlファイルに飛ぶという風にするにはどうすればよいのでしょうか?もしよろしければ仕組みを教えていただけないでしょうか。。。下に、作成したフォームのコードを書きます。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>無題ドキュメント</title> <script language="JavaScript" type="text/JavaScript"> <!-- function MM_findObj(n, d) { //v4.01 var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) { d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);} if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n]; for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); if(!x && d.getElementById) x=d.getElementById(n); return x; } function MM_validateForm() { //v4.0 var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments; for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=MM_findObj(args[i]); if (val) { nm=val.name; if ((val=val.value)!="") { if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@'); if (p<1 || p==(val.length-1)) errors+='- '+nm+' に、メールアドレスを正しく入力してください。\n'; } else if (test!='R') { num = parseFloat(val); if (isNaN(val)) errors+='- '+nm+' must contain a number.\n'; if (test.indexOf('inRange') != -1) { p=test.indexOf(':'); min=test.substring(8,p); max=test.substring(p+1); if (num<min || max<num) errors+='- '+nm+' must contain a number between '+min+' and '+max+'.\n'; } } } else if (test.charAt(0) == 'R') errors += '- '+nm+' は、必ず入力してください。\n'; } } if (errors) alert('次のエラーが発生しました。\n'+errors); document.MM_returnValue = (errors == ''); } //--> </script> </head> <body bgcolor="#000000"> <div align="center"> <p><font color="#FFFFFF" size="+1"><br> <br> <br> </font></p> <p align="center"><font color="#FFFFFF"><br> </font></p> <form action="" method="post" name="price" id="price" onSubmit="MM_validateForm('金額','','R','名前','','R','Eメールアドレス','','RisEmail');return document.MM_returnValue"> <p><font color="#666666">お名前(必須)</font><br> <input name="名前" type="text" id="名前" style="ime-mode:active" size="20"> <br> <font color="#666666"><br> </font> <font color="#666666">メールアドレス(必須)</font> <br> <input name="Eメールアドレス" type="text" id="Eメールアドレス" style="ime-mode:disabled" size="35"> k<br> <font color="#666666">(お知らせメールをお送りいたします。) </font> </p> <p> <input type="submit" name="Submit2" value="送信してダウンロード"> <br> <font color="#666666">送信後、ダウンロードページに飛びます!</font> </p> <p><font color="#666666">システムが分からない方はDOWNLOADRULEをお読み下さい。</font></p> </form> <p> </p> </div> </body> </html>
- net_lander
- ベストアンサー率49% (40/81)
Q1.>ページで送信を押すと、すぐにダウンロードが始まるようにしたいのですが、送信ボタンを押すとすぐにダウンロードが始まるというようなことは技術的に可能なのでしょうか? A2.可能ですが、クライアント側に何の確認もさせずにダウンロードさせたいということでしょうか? だとしたら、クライアント側のブラウザのセキュリティポリシを変更しないといけません。 または、ブラウザに依存しないアプレットを用意する事です。 例:ActiveX(注:Windowsでしか動かない)、Java、Flash、e.t.c. Q2.>htaccessファイルでできるのでしょうか? A2.できません。 このような場合、最も簡単な方法はwebルートの上にファイルを置くことです。 ただし、一般的なプロバイダのHPサービスでは不可能です。
補足
回答ありがとうございます!クライアント側がダウンロードしたいということでフォームを記入してもらう予定なので、確認はしてもらっていることになると思います。セキュリティポリシとはクライアント側からしか、変更できないものですよね?いちおうFLASHは作成できる環境にいるのですが、いまいちなにをして良いのかわからないです・・・曲はMP3(zipに入れる)で配信するつもりです。 送信ボタンを押すとすぐにではなく、 フォーム(送信ボタンを押す)→フォームのお礼画面(ご協力ありがとうございましたなどがあり、ダウンロード先のLINKが貼ってある)→ダウンロード であれば、技術的に簡単になり、htaccessでの直リン防止をダウンロード先、またお礼画面にほどこすことができるのでしょうか? なぜ、送信ボタンを押すとすぐにダウンロードが始まるようにしようと思ったのかというと、CGIを使ってフォームの内容を回収する場合、フォームの送信ボタンを押した後に、どのようなページに飛ぶのかということがよくわからないということがありました。htmlで送信ボタンを押した後に飛ぶ先を指定できるのでしょうか? ほんとうにわからないことだらけで、申し訳ないのですが、お暇な時に教えていただければ幸いです。
お礼
いろいろと今までお付き合いいただきほんとうに感謝しています。OKWEBのありがたみが本当にわかりました!残された疑問点については、勉強したり、またここで聞いたりして解決させようと思います。 また機会があれば是非よろしくお願いします。 では!