プロが教えるわが家の防犯対策術!

URLに「.html」の拡張子がなくても表示される。

よろしくお願いします。
例えば、下記のようなURLがあり、(A)の場合でも(B)の場合でもページが表示されてしまいます。
同じレンタルサーバーを利用しているサイトで確認したのですが、
htmlがなければ、表示されていません。従いまして、サーバーの機能ではないと思います。

A)http://www.hoge.co.jp/hoge.html
B)http://www.hoge.co.jp/hoge

※動的なページではなく、HTMLファイルをアップするだけの静的なページです
※hogeページはindexページではありません


最近、下記のような「.htaccess」を作成、アップしたからかと思い、
.htaccessを削除したものの、変化はありませんでした。

---------------------------------------------------
RewriteEngine on
RewriteCond %{HTTP_HOST} ^hoge\.com
RewriteRule ^(.*)$ http://www.hoge.com/ [R=301,L]
ErrorDocument 404 /error.html
---------------------------------------------------


通常のように「.html」の拡張子がなければ表示されない
というようにしたく思います。

この件につきましてご教授いただけますと幸いです。

A 回答 (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を返すはずですが・
    • good
    • 0
この回答へのお礼

ありがとうございます!

おかげさまで疑問がすべて解消しました。
処理の流れ、またPATH_INFOの存在をお教え頂けたことで、理解ができました。

> /test ディレクトリが存在している場合は通常はNOT FOUND 401を返すはずですが・

testディレクトリを作成しましたら、404がでました。
仰せの通りに拡張子で考えてばかりでしたので行き詰っていました。


何か根本的な設計ミスがあったのかと思い、
ひやひやしていましたが、これですっきりです。

重ねて、この度は誠にありがとうございました!

お礼日時:2014/05/23 19:39

典型的なサーバーの機能です。


製作されているなら、開発者向けツール( https://addons.mozilla.jp/firefox/extensions/dev … )の豊富な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の設定ミスがあるのでは、と思い、この度、質問させて頂きました。

この度の件について、引き続き、情報を頂けましたら幸いです。

補足日時:2014/05/23 16:50
    • good
    • 0

>>サーバーの機能ではないと思います。



サーバの機能だと思います。


.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/ [R=301,L]
ErrorDocument 404 /error.html
Options -MultiViews
-----------------------------------------------------

引き続き、この件でのご助言をいただけますと幸いです。

補足日時:2014/05/23 13:28
    • good
    • 0

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


このQ&Aを見た人がよく見るQ&A