- ベストアンサー
URLに「.html」の拡張子がなくても表示される
- URLに「.html」の拡張子がなくても表示される理由についての質問です。
- 同じレンタルサーバーを利用しているサイトで確認したところ、htmlがなければ表示されなかったことを報告しています。
- 質問者は.htaccessを削除したが、変化はなかったと述べています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
拡張子云々は忘れて以下の説明を理解してください。 例えば、URLが、次のようなものだったとします。 http://hoge.com/abc/efg/hij これは、ブラウザでリンクをクリックすると、HTTPプロトコルで、hoge.comで参照されるインターネット上のコンピューターのHTTPサーバーに対して、/abc/efg/hijファイルをくれ!と要求しています。 GET: /abc/efg/hij という要求ヘッダになります。(Live HTTP Headerの結果を確認する。) サーバーがすること / |-- abc/ |-- efg/ |-- hij というファイルを探します。(拡張子はこの段階では関係ない) (それがファイルであった場合) そのファイルの種類の設定がサーバーにあるか確認します。 ・設定がない場合はデフォルトの指定 --通常はtext/plain と判断して、HTTP応答ヘッダに content-type:text/plain をつけてブラウザに返します。 ・設定がある場合は、それに従います。 (例えば.ataccessにて、 AddType application/x-httpd-cgi efg;だったら実行ファイルとして処理します。 content-type:はそのプログラムが出力する。 AddType image/jpeg *; だったら、*(ワイルドカード)なので そのディレクトリすべてのファイルをjpegと判断してHTTP応答ヘッダに content-image/jpeg をつけて送り出します。 (そのhijがディレクトリであった場合) ・それを開いてみます。 ・DIRECTORY INDEXが指定されていれば、そのファイルの有無を調べてそれを提供 通常はindex.html INDEX.HTM index.php・・とか複数指定することが多い。 これを順番に探します。 ・存在すれば、そのファイルの指定↑に従います。 tex/htmlとか application/x-httpd-cgi とか ・DIRECTORY INDEXの指定がない(通常は指定されているが)、あるいはDIRECTORY INDEX に指定がない場合は ★/hojは、PATH_INFOという環境変数に格納して、/efg について、上と全く同じ処理を行ないます。 (上の/hijを/efgに置き換えて読む)よって省略 ★/efgもない場合はそれもPATH_INFOに追加します。PATH_INFOの値は /efg/hij になる。 ★ 最後に/ルートについて同様な処理をします。 それでもない場合は、 ・404 NOT foundを返すか、 ・PATH_INFに存在するディレクトリのファイル一覧を返す かの指定に従います。 以前はディレクトリ一覧を表示することが多かったのですが、 最近の素人さんが利用するサーバーはNOT FOUNDを返します。 301などを返すよう指示もできます。 お馬鹿なコンピューターですから、この一見複雑だが単純な機械的処理をしています。 >htmlがなければ、表示されていません。従いまして、サーバーの機能ではないと思います。 > A)http://www.hoge.co.jp/hoge.html > B)http://www.hoge.co.jp/hoge それは、 ・/hogeディレクトリにDIRECTORY_INDEXで指示されたファイルがないか ・/hogeファイルがないか ・/hogeがCGIであって、エラーを返しているか ・/にある「DIRECTORY INDEXに指定して指定されているファイルがない」 その他の理由も考えられる。 >なるほど、ヘッダー情報を読み取って、 >サーバーで表示処理をしているのですね。ご指摘ありがとうございます。 ヘッダ情報に何を書くかはサーバーの設定ですが、ヘッダー情報を元にブラウザが決めています。 >サーバーに電話で問い合わせたところ、 >そのような機能はなく、設定もしていないと回答を受けたことと、 サーバーのデフォルトの指定のままだという事です。 >同じレンタルサーバを利用しているサイトで調べると、.html をURLから外せば404が出、 >さらにそのサーバー会社のURLから.htmlを外しても、404が出ています。 これは、 ・.htmlを外した同名(hoge名の)ディレクトリが存在し ・その中にDIRECTORY_INDEXで指定されたファイルがない ・その場合に404を返す指定になっている と言う事です。 >http://www.hoge.com/test.html >http://www.hoge.com/test/00002.html ←00002.htmlを削除すると、上記URLが表示される DIRECTORY_INDEXにtest.htmlが指定してある以外、通常のデフォルト指定なのです。 /test ディレクトリが存在している場合は通常はNOT FOUND 401を返すはずですが・
その他の回答 (2)
- ORUKA1951
- ベストアンサー率45% (5062/11036)
典型的なサーバーの機能です。 製作されているなら、開発者向けツール( https://addons.mozilla.jp/firefox/extensions/developer_tools/ )の豊富なfirefoxお使いだと思いますが、Live HTTP Headersでサーバーの応答ヘッダに、content-type:text/html が確認できると思います。 Windowsを使っていると拡張子で頭が固定されてしまいますが・・・他のOSでは拡張子は単なるファイルの種類をメモる程度のものにしか過ぎません。以前はこれが問題で、windowsはサーバーから送られるcontent-typeを無視して自分に登録されているファイルとして動作することがしばしば問題になりました。 >通常のように「.html」の拡張子がなければ表示されないというようにしたく思います。 これをしてはなりません。例えば掲示板やカウンター画像、PHPで提供される拡張子は、その有無も含めて様々です。サーバーの応答ヘッダに従うべきです。正しい応答ヘッダが出力されるようにすべきで、拡張子に関わらずブラウザがファイルの種類を応答ヘッダで判断すべきです。 ※hogeページはindexページではありません 仕組みを誤解されているようです。 ★拡張子がない場合の処理--例えばディレクトリを含めてPATH_INFOが提供された時に、ディレクトリやファイル毎にどういう動作をするかとは、全く別の仕組みです。(サーバーの設定の設定) 今から出かけるので、詳しい説明は後刻になります。
補足
ご回答ありがとうございます。 > 拡張子に関わらずブラウザがファイルの種類を応答ヘッダで判断すべきです。 なるほど、ヘッダー情報を読み取って、 サーバーで表示処理をしているのですね。ご指摘ありがとうございます。 ただ、疑問が残るのは、 サーバーに電話で問い合わせたところ、 そのような機能はなく、設定もしていないと回答を受けたことと、 同じレンタルサーバを利用しているサイトで調べると、.html をURLから外せば404が出、 さらにそのサーバー会社のURLから.htmlを外しても、404が出ています。 もう一点、 この度、質問させていただきました経緯としまして、 下記のようなディレクトリ構造で、「test」フォルダを削除し、 そのURL(http://www.hoge.com/test/00002.html)が消えているかブラウザで確認したところ、 ひとつ上の階層にある、「test.html」が表示されてしまいました。 http://www.hoge.com/test.html http://www.hoge.com/test/00002.html ←00002.htmlを削除すると、上記URLが表示される 削除したフォルダ名が「test」で、表示されるファイル名がひとつ上にある「test.html」ですので、 何かリネームのような機能が変に働いているのでは、 また、当方の.htaccessの設定ミスがあるのでは、と思い、この度、質問させて頂きました。 この度の件について、引き続き、情報を頂けましたら幸いです。
- muuming2001
- ベストアンサー率23% (202/847)
>>サーバーの機能ではないと思います。 サーバの機能だと思います。 .htaccess に Options -MultiViews でどうでしょう? サーバによっては.htaccessにて設定の上書きを許可していない(技術的に設定の上書き不可能にしている)サーバ屋もありますので上記で可能か不可能かはやってみないとわかりません。 http://www.ksknet.net/apache/multiviews.html
補足
ご回答ありがとうございます。 >>サーバーの機能ではないと思います。 サーバーに確認しましたところ、 特にそういう設定は行っていないとのことでした。 .htaccess の記述の件 お教え頂きました「Options -MultiViews」を下記のように加えたところ、 インターナルサーバエラーが発生しました。 ----------------------------------------------------- RewriteEngine on RewriteCond %{HTTP_HOST} ^hoge\.com RewriteRule ^(.*)$ http://www.hoge.com/$1 [R=301,L] ErrorDocument 404 /error.html Options -MultiViews ----------------------------------------------------- 引き続き、この件でのご助言をいただけますと幸いです。
お礼
ありがとうございます! おかげさまで疑問がすべて解消しました。 処理の流れ、またPATH_INFOの存在をお教え頂けたことで、理解ができました。 > /test ディレクトリが存在している場合は通常はNOT FOUND 401を返すはずですが・ testディレクトリを作成しましたら、404がでました。 仰せの通りに拡張子で考えてばかりでしたので行き詰っていました。 何か根本的な設計ミスがあったのかと思い、 ひやひやしていましたが、これですっきりです。 重ねて、この度は誠にありがとうございました!