- ベストアンサー
YouTubeの動画ページについての疑問
- YouTubeの個々の動画ページについて、URLの構造やファイルの拡張子について疑問があります。
- 具体的には、URL内のresultsやwatchが何を表しているのか、またファイルの拡張子を隠す理由について知りたいです。
- さらに、resultsやwatchが存在しないとTOPページに戻される理由について教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
1回Webサーバの役割について考えてみるといいと思います。 「公開ディレクトリ内にファイルを置いて、それに対応するパスでアクセスすると、そのファイルの内容をブラウザに返す」 という処理を何の疑問も無く普段眺めていると思いますが、何もプログラムを動かさずにこんなことが実現できるわけがありません。Webサーバのプログラム、具体的にはApacheやnginxといったものが動いているはずです。 PHPの動作形態には「Webサーバモジュール」「FastCGI」「CGI」といったものがありますが、ここでは初心者に最も身近なWebサーバモジュールについて触れます。「mod_php」と呼ばれることがあります。PHPを独立したプログラムとして動かすのではなく、サーバの機能の一部として実行するということです。XAMPPを利用しているのであれば「Apache + mod_php」という構成になるはずです。 以下、どのようにしてリクエストに対してレスポンスが返されるのか考えてみましょう。 -------------------------------------------- 【クライアント側の事前準備】 1. Webブラウザを起動する。 【サーバ側の事前準備】 1. Apacheを起動する。 2. ApacheがHTTP通信用に80番ポートを監視する。HTTP通信はポートを明示しない場合80番を使用するため。 【アクセス】 ~クライアント側~ 1. 「http://example.com/foo/bar.php」というURLがWebブラウザに入力される。 2. 「example.com」のIPアドレスをDNSサーバに問い合わせる。ここでは「93.184.216.119」を得たとする。 3. 「93.184.216.119」の80番ポートに対して「/foo/bar.php」というパスでHTTPリクエストを送る。 ~サーバ側~ 4. 監視している80番ポートへのリクエストを検知する。 5. 同時に複数のリクエストを捌けるように、事前に起動しておいた親プロセス自身はレスポンスを返す処理をせずに、分岐(fork)した子プロセスに処理を丸投げする。引き続き親は監視処理を行い、子が6以降の処理を担う。 6. 「/foo/bar.php」という文字列を解析し、「公開ディレクトリ/foo/bar.php」へのアクセスであると決定する。この文字列自体にそういう意味があるのではなく、Apacheがあくまでそうしているというだけのことである。 7. 「公開ディレクトリはディレクトリ(当たり前)」→「fooはディレクトリ」→「bar.phpはファイル」というようにファイルを検知するまでパスを辿っていく。もしこのファイルが見つからない場合は404NotFoundを返し、アクセスが禁止されている場合は403Forbiddenを返す。 8. 「.php」を見てPHPファイルであると判断し、mod_phpとしてソースコードの読み取り/処理の実行/レスポンスの生成といった一連の作業を行う。これもあくまでApacheの事前の設定に基づいて行っているだけのことである。 9. 生成したレスポンスをクライアント側に返す。 10. 役目を終えた子プロセスが死ぬ。 ~クライアント側~ 11. レスポンスを読み取る。 12. レスポンスに含まれるHTMLをWebブラウザが解析し、人間が分かりやすいように表示する。 ※ クライアント側のポートは開いているものが自動選択されるようです。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1121251946 -------------------------------------------- さて強調して書きましたが、パスはあくまでApacheで動かす場合にのみ意味があるものです。世の中にはApache以外で動くWebサイトもたくさんあります。「php_cli」(コマンドラインで動作するPHP)が「Apache + mod_php」の代わりをすることだって出来ちゃいます。 HTTPリスエストをそのまま返すPHPサーバ http://www.1x1.jp/blog/2007/07/php_http_echo_server.html >> ?以降のserch_query=[検索キーワード]やv=[動画の識別コード]は$_GETの取得だということは分かるのですが、 $_GETのような変数が存在するのはおそらくPHPぐらいですが、他の言語にも似たような仕組みはあるでしょうね。 >> ?直前のresultsやwatchは何を表しているのでしょうか? 既に述べたように、実際にこのようなファイルが存在していなくても、この部分を読み取ってそれに応じた処理を行うことだって出来るんです。「resultsというディレクトリやファイルを探しに行く」というのはあくまでApacheの動作です。自分が作るプログラム自身がApacheの代わりにだってなれるんです。 ちなみにPHPに関して… >> 「公開ディレクトリはディレクトリ(当たり前)」→「fooはディレクトリ」→「bar.phpはファイル」というようにファイルを検知するまでパスを辿っていく。 と書いたことには意味があり、途中でファイルが見つかったときには $_SERVER['PATH_INFO'] という情報が定義されます。それほど使われることは無いですが。 http://php.net/manual/ja/reserved.variables.server.php http://qiita.com/mpyw/items/7852213f478e8c5a2802#1-6 >> また、URLをresultsやwatchまで記述してページを読み込んでみたところ、TOPページに飛ばされました。 不正なリクエストと見なされて飛ばされているだけでしょうね。ただここで気を付けてほしいのは、「何が」不正と判断しているかです。もしApache+mod_phpで動いていると仮定すれば以下のような動作になります。 ・ファイルが存在しないとき Apacheデフォルトの404NotFoundのページが返される。 ・ファイルが存在するが、読み取り権限が無いとき Apacheデフォルトの403Forbidenのページが返される。 ・ファイルが存在してmod_phpで実行するが、ソースコード内でパラメータが不正と判断されたとき PHPによって生成されたエラーページが返される。 >> また、最近のWEBページはほとんどがURLにファイルの拡張子がないように見受けられますが、ファイルの拡張子というのは隠した方が良いのでしょうか? 【自分の書いたプログラム自信がサーバとして動いている場合】 ・そもそもファイル拡張子の概念がありません。Javaやnode.jsはこちらに属します。 【Apacheで動いている場合】 ・拡張子の無いファイルをPHPとして実行させることが設定次第で可能です。但しあまりこのような手段は採られません。 ・リクエストがあったとき、パスやクエリストリング(?以降)を事前に設定したルールによって書き換えることが出来ます。そして全てをクエリストリングにまとめ、特定の1ファイル(フレームワークではフロントコントローラと呼ばれる)に飛ばすことが出来ます。非常によく用いられている手法です。
その他の回答 (1)
- Taiyonoshizuku
- ベストアンサー率37% (183/489)
拡張子って多くのWebサーバでは飾り。 resultやwatchはお察しの通り、処理するプログラム。 隠しているというか、フレームワークを使ったりすると、パスのみで動かしたりする。 トップページに飛ばされるのは取得するデータが無い、不正なパラメータ等を判断して飛ばす。 先にも言ったけど、隠しているわけではなくそうやって動くもの。 隠しても特にメリットなっしんぐ。 ヘッダ情報見れば何で動いているかわかる場合もあるし、大体推測できる。
お礼
ご回答ありがとうございます! 別に隠しているというわけではないのですね。 フレームワークは使っていないのでこれを気に学習してみます!
お礼
ご回答ありがとうございます! 自分の書いたプログラムをサーバとして動かすことができるんですね。 Apacheの勉強の真っ只中なのでそこまで存じ上げませんでした。 プログラミング初心者の私にはまだきちんとした理解ができていない部分が多いのでせっかく詳しいご回答を頂きましたので、きちんと理解して知識として吸収できるよう頑張ります。 詳しくご説明頂いたのでベストアンサーにさせて頂きます。