現在利用しているサーバーが、


下記の様なhogeディレクトリの構成で
/hoge
   .htaccess
   index.html


http://sample.com/hoge/index/
とアクセスするとindex.htmlが一階層下に存在するとして表示されます。
※404エラーになりません。

これを正常に404エラーになるようにすればどこを調整すればいいのでしょうか?

ちなみに.htaccessは以下のように設定しています。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) hoge.php

よろしくお願いいたします。

回答の条件
  • URL必須
  • 1人5回まで
  • 13歳以上
  • 登録:2010/05/27 08:57:32
  • 終了:2010/05/31 13:00:54

ベストアンサー

id:rouge_2008 No.2

rouge_2008回答回数594ベストアンサー獲得回数3512010/05/27 12:01:52

ポイント100pt

どのように動作させる事が望みでしょうか?

RewriteRule ^(.*) hoge.php

現在は、上記の記述により、すべてのアクセスが「hoge.php」を読み込んで表示する設定になっています。


単純に「.htaccess」と同じ階層(WEBルート)にあるファイルにアクセスした時だけ、「hoge.php」を読み込んで表示させたいという場合は、上記の記述を以下に変更してみてください。

RewriteRule ^([^/]*)$ hoge.php

もし、希望する動作と違う場合は、希望する動作の詳細を教えてください。

※コメント欄を開けて下さった方が、ちょっとしたやり取りなどし易いです。

URLはダミーです。

http://q.hatena.ne.jp/

id:a_watuu

ありがとうございます。

コメント欄あけました。


■概要

商品カテゴリにアクセスした際に、

リクエストされたURLを元に各商品を表示させたい。

※処理はhoge.phpで行います。

ただ、特集ページtokusyu.htmlを作成した際に、以下のような動作になります。

○sample.com/product/tyokusyu.html→特集ページを表示

×sample.com/product/tyokusyu/→hoge.phpで処理がおこなわれずtyokusyu.htmlが表示される


■構成

/product

  .htaccess

  index.html

  tokusyu.html

  hoge.php

このような内容でわかりますでしょうか?

この動作が正常なのであればtokusyu.htmlを別のディレクトリに移動するなどで対応しようかとも思っています。

よろしくお願いします。

2010/05/27 12:50:56

その他の回答(1件)

id:hanako393 No.1

hanako393回答回数1142ベストアンサー獲得回数872010/05/27 09:16:44

ポイント35pt

DirectoryIndex index.xxx

デフォルトインデックスのファイル名を変更

http://q.hatena.ne.jp/answer

id:a_watuu

ありがとうございます。

DirectoryIndex index.php index.html

を.htaccessの最初や最後やらにかいてみたんですが、以前

http://sample.com/hoge/index/ にアクセスすると404にならずにindex.htmlが表示されます。

サーバー側でrewriteしてるのかなぁ。。

http://d.hatena.ne.jp/koseki2/20090921/ModDirRewrite

2010/05/27 10:31:24
id:rouge_2008 No.2

rouge_2008回答回数594ベストアンサー獲得回数3512010/05/27 12:01:52ここでベストアンサー

ポイント100pt

どのように動作させる事が望みでしょうか?

RewriteRule ^(.*) hoge.php

現在は、上記の記述により、すべてのアクセスが「hoge.php」を読み込んで表示する設定になっています。


単純に「.htaccess」と同じ階層(WEBルート)にあるファイルにアクセスした時だけ、「hoge.php」を読み込んで表示させたいという場合は、上記の記述を以下に変更してみてください。

RewriteRule ^([^/]*)$ hoge.php

もし、希望する動作と違う場合は、希望する動作の詳細を教えてください。

※コメント欄を開けて下さった方が、ちょっとしたやり取りなどし易いです。

URLはダミーです。

http://q.hatena.ne.jp/

id:a_watuu

ありがとうございます。

コメント欄あけました。


■概要

商品カテゴリにアクセスした際に、

リクエストされたURLを元に各商品を表示させたい。

※処理はhoge.phpで行います。

ただ、特集ページtokusyu.htmlを作成した際に、以下のような動作になります。

○sample.com/product/tyokusyu.html→特集ページを表示

×sample.com/product/tyokusyu/→hoge.phpで処理がおこなわれずtyokusyu.htmlが表示される


■構成

/product

  .htaccess

  index.html

  tokusyu.html

  hoge.php

このような内容でわかりますでしょうか?

この動作が正常なのであればtokusyu.htmlを別のディレクトリに移動するなどで対応しようかとも思っています。

よろしくお願いします。

2010/05/27 12:50:56
  • id:rouge_2008
    「.htaccess」には、質問文にある記述の他には何も書いていないのでしょうか?

    ○sample.com/product/tokusyu.html→特集ページを表示

    上記は正常な動作です。

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    上記2行の記述で、「ファイルやディレクトリが存在しない場合」という条件をつけています。
    「sample.com/product/tokusyu.html」は、ファイルが存在するので、そのまま「tokusyu.html」が表示されます。

    ×sample.com/product/tokusyu/→hoge.phpで処理がおこなわれずtyokusyu.htmlが表示される

    こちらは想定外の動作をしています。
    「sample.com/product/tokusyu/」は、「sample.com/product/tokusyu/index.html」(※DirectoryIndexの設定順で異なります。)へのアクセスですが、ファイルが存在しないはずですので、「hoge.php」を実行して結果を「sample.com/product/tokusyu/index.html」として表示するのが正常な動作です。

    http://httpd.apache.org/docs/2.0/ja/mod/mod_dir.html#directoryindex


    「product」が商品カテゴリのディレクトリ名でしょうか?
    今回の問題とは関係ないと思いますが、一応「RewriteBase」を指定して置いた方が良いと思います。

    ※回答で『「.htaccess」と同じ階層(WEBルート)~』と書きましたが、正しくは『「.htaccess」と同じ階層(「hoge」=「product」ディレクトリ)~』です。m(__)m
    下の階層が存在しなくて、尚且つ「sample.com/product/xxxxx/zzz.html」等、下の階層を指定したURLでのアクセスも無いのでしたら、回答した記述も試してみてください。

    RewriteEngine On
    RewriteBase /product
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]*)$ hoge.php
  • id:a_watuu
    RewriteBase に 正規表現 勉強になります。
    少し構成を変えて別のサーバー(さくらサーバー)で試してみました。

    ■構成
    /blog.watuu.net(ルートディレクトリ)
      .htaccess
      index.html
      
      /product(商品ディレクトリ)
        index.html
        tokusyu.html
        hoge.php
     
    ■.htaccess
    DirectoryIndex index.php index.html
    RewriteEngine On
    RewriteBase /product
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(/product/.*)$ hoge.php
     
    ■結果
    商品ディレクトリの特集ページを表示
    [OK] http://blog.watuu.net/product/tokusyu
    [OK] http://blog.watuu.net/product/tokusyu.html
     
    商品ページをのhoge.phpを利用して表示
    [OK] http://blog.watuu.net/product/ZZZ/
    [NG] http://blog.watuu.net/product/tokusyu/
     
    やっぱりこれが正常な動作なのかなぁ。
    サーバーがスラッシュをどんなに解釈してるかの問題っぽいですね・・・
  • id:gekikawa
    おや?うまくいかれたんですか!

    さくらサーバは特定の拡張子は補完して表示してくれる(表示してしまう?)
    みたいですね。私もindex.phpを表示する際にindexとだけ書いてしまったURLで
    正しく表示されたことがあり、ちょっとびっくりした記憶があります。
  • id:rouge_2008
    想定外の動作だったのは、さくらで拡張子を自動で補完しているのが原因のようですね。
    「tokusyuu」ディレクトリ下など、特定のディレクトリへのアクセスがあった場合だけ404エラーを表示させるのが目的でしたら、以下のようにして除外ディレクトリを指定してみてください。

    DirectoryIndex index.php index.html
    RewriteEngine On
    RewriteBase /product

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond $1 !^(tokusyuu)
    RewriteRule ^(.*)$ hoge.php [L]

    ※上記は、「.htaccess」を「product」ディレクトリに設置する場合です。
    WEBルートに設置する場合は、除外ディレクトリの指定行を「RewriteCond $1 !^(/?product/tokusyuu)」にしてください。
    ※「RewriteBase /product」を指定しているので、「RewriteRule」の条件に「^(/product/.*)$」のように「product」を含める必要はありません。
    ※「!^(tokusyuu|campaign)」のように「|」で区切ると複数のディレクトリを指定できます。

    http://matsui.hamazo.tv/e1710565.html


    下層のディレクトリへのアクセスすべてを404エラーにしたい場合は、既に回答やコメントで投稿していますが、以下のルールを試してみてください。

    DirectoryIndex index.php index.html
    RewriteEngine On
    RewriteBase /product

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]*)$ hoge.php [L]
  • id:a_watuu
    gekikawaさん rouge_2008さん ありがとうございます。

    RewriteBase に 正規表現 に続き、
    サーバー 拡張子 補完にかんする勉強もできました。
    http://q.hatena.ne.jp/1162483008


    さくらでは使えないようなんですが、
    Options -MultiViews
    って設定もあるんですね。
    別のサーバーで使ってみてrouge_2008さんの書き方でうまくいきました。


    ポイントの付け方がよくわからなく星をいっぱいつけてしまいました。
    一旦終了させていただきます。


    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません