新しく質問する

【URL統一】 /index.html へのアクセスを /で終わるURLに

役に立った:4件
  • 質問者:access443
  • 投稿日時:2007/10/06 15:46
  • 困り度:困ってます
  • 友達に紹介
  • ブログに書く
  • 教えて!gooお気に入り

以下のサイトは、私が実現したいことの逆の設定をしていると思われます。
http://www.jaccs.co.jp/index.html

http://www.jaccs.co.jp/
にアクセスすると、index.htmlつきのアドレスに転送されています


上記の例の逆のように、
http://www.hoge.com/index.html
にアクセスされた場合、
http://www.hoge.com/
とさせるには、どのようにすればよいでしょうか?


以下のようなサイトを参考にしたりして、いろいろ調べてみましたが、うまくいかなかったり無限ループになったりしてしまいます。
http://pmakino.jp/tdiary/20061105.html#p02
http://codezine.jp/a/article/aid/1096.aspx


おそらく
「mod_rewriteを利用して、URLを書き換える」
というのが、答えにたどりつけそうな手法だと思うのですが、ソースが分かりません。

詳しい方、ご教授お願いします。

この質問に回答する
このQ&Aは役に立ちましたか?(役に立った:4件)

回答(2件)

  • 参考になった:0件
  • 回答者:cdsdasds
  • 回答日時:2007/10/07 01:46

>なるほど!と思い、DirectoryIndexからindex.htmlを除くと、ディレクトリが丸見えになってしまいました。
>なお、index.htmlはトップページで使っていますので、除いちゃうとおかしくなりませんか?

だから、そうなるってことはトップページのURLは正しくはhttp://www.hoge.com/index.htmlなんですよね、
とすると、どんなに頑張っても/index.htmlへのアクセスは最終的に/index.htmlに辿りつかせないといけないわけで、それだとループするような気がしますけど。

たとえば、/index.phpというファイルがあって、これが本体で、index.htmlへのアクセスは、一度/へ飛ばされた上で、/index.phpに回されるなら問題はないです。
PHPファイルなら、自分が飛ばされてきたのか、最初に来たのかもわかりますから、/index.php → / → /index.phpでも問題は有りません。

でもhtmlは自分が最初にアクセスされたのか、とばされてきたのかわかりませんから、ページの中に飛ばすコードが書いてあれば/から来た時でも飛ばしますし、書いてなければ、最初にアクセスされた時でも/に飛ばすことはできません。

で、飛ばすのをmod_rerite、.htaccessとかでという話なのでしょうが、.htaccessは飛ばすことしかできないですし、1.3系のmod_reriteは基本的にアクセスされたURLを正規表現でファイル名に書き換えることしかできないので、同一のURLを書き換えることができません。

よって、どう頑張っても/index.html → /→ /index.html→ /→ 
のループからぬけられないのです。

コードで説明すると
RewriteEngine on
RewriteCond %{REQUEST_URI} (.*/)index\.html?$
RewriteRule .* %1 [R=301,L]
の場合
http://www.hoge.com/index.htmlへアクセスが発生するということはhttpでは
get /index.html
ってことですよね。これをRewriteCond %{REQUEST_URI}(.*/)index\.html?$ でトラップして、RewriteRule .* %1 [R=301,L]iに従って、Moved Permanentlyでhttp://www.hoge.com/に飛ばします
get /
となりますよね。
で、質問者の場合、これは/のインデックスを表示しようとして、index.htmlファイルが渡されることになり、
最初に戻るわけです。

2系なら、たぶん/からindex.htmlの際に再度の読み替えを禁止できますから、index.htmlが相手に渡ってめでたしめでたしになると思います。

もっとも、質問者の環境ではそれは無理とのことですし、そもそも共有サーバーで、バーチャルドメインの場合、既にルールが組み込まれていたりしますから、こちらでmod_rewriteや.htaccessをいくら巧みに制御しようとせこせこ書いても、サーバ側が用意したルールにオーバーライトされて結局うまくいかないことが多いです。例えばget /を強制的にget /index.htmlとかに変えたり、その逆をやるような極悪ルールがあったりします。

結局のところ、ループを抜けて、/index.htmlを渡そうとすると、話としては、一度別の/とは関係のないURLへ飛ばして/index.htmlに回送すればいいのですが、それだと、そもそもの目的であった、SEOのために/index.htmlは/に飛ばされるということを示したいという話がグダグダになりますから意味がないわけです。

よって、最初の回答に書いたように
http://www.hoge.com/への集約をあきらめhttp://www.hoge.com/index.htmlへの集約を検討する。
とか
冒頭に書いたように本体を
http://www.hoge.com/index.php
として、index.htmlは単なる飛ばすだけのファイルにするとかいうのはどうですかというはなしになるのです。

個人的には色々やるよりサーバ変えることをお勧めしますし、たぶんそれが早道だと思いますが、そうもいかないのであれば単純なSEOのプロットは修正して、次善の策を考える必要があると思いますが。

通報する

  • 参考になった:0件
  • 回答者:cdsdasds
  • 回答日時:2007/10/06 18:16

そもそも、何でそんなことが必要なのでしょう。SEOとかならindex.htmlでまとめるのはどうなんでしょう。そもそもドメインの転送前にやることがあるようにも思いますが。
また、OSはなんですか、サーバソフトは何で、バージョンはいくつでそれは変更可能ですか?、ドメイン名/のディレクトリは完全に質問者の権限の中ですか、サーバでバーチャルドメイン使ってますか?、.htaccessは記述できますか?(管理権限上できるか)、あるいはまたブラウザに制約を付けることはできるのですか(IE6のjavascriptを実行しているものしか考えなくてよいとかできるのか)。PHPとかは使えるのですか?

サーバはApacheを想定されているようですが、2系なのか1系なのか、無限ループと言っていますから1系のような気はしますが、その場合だと2系に変更できないか等、細かな記述の仕方をうんぬんする前の解決策があるようにも思います。

とりあえず、1系を考えているのなら、mod_rewriteではなく素直に、ページに細工するか、.httaccessに細工して飛ばすことをかんがえましょう。

無限ループとのことですが、DirectoryIndexからindex.htmlは除いてありますよね。

除いてないと、http://www.hoge.com/index.htmlを渡す、からとぶ→http://www.hoge.com/に転送→http://www.hoge.com/index.htmlを渡す、から飛ぶ→の無限ループになるのはお分かりいただけると思うのですが。

あとは、ご自身が書かれているページに答えは有りますから、書き換えればいいだけだと思いますが。

通報する

この回答への補足

>>そもそも、何でそんなことが必要なのでしょう。SEOとかならindex.htmlでまとめるのはどうなんでしょう。

SEO対策です。

トップページが重複して認識されないようにしたいだけです。

作成ソフトで内部ページからトップページにリンクを設定する際、「index.html」と指定してしまう場合があり、その都度絶対URLに直しているのですが、hoge.com/index.htmlへアクセスされたさい、htaccessなどでスラッシュで終わるURLに飛ばせれば便利だなと考えたわけです。

wwwあり、なしのURL統一方法は沢山解説ページがあったのですが、index.htmlへのアクセスを/で終わるURLに統一する方法は見つけることができませんでしたので、ここに質問させていただきました。



>>OSはなんですかサーバソフトは何で、バージョンはいくつでそれは変更可能ですか?、

OS:Linux
Apache/1.3.37です。



>>ドメイン名/のディレクトリは完全に質問者の権限の中ですか

はい。そうです。


>>サーバでバーチャルドメイン使ってますか?

共有サーバーなので、バーチャルドメインになるとおもいます。



>>.htaccessは記述できますか?(管理権限上できるか)

はい、記述できます。


>>あるいはまたブラウザに制約を付けることはできるのですか(IE6のjavascriptを実行しているものしか考えなくてよいとかできるのか)。

ロボットのことばかり考えており、ユーザーのことは頭にありませんでした。
基本的には、ブラウザやJAVAの制限を受けずに転送させたいと思っています。


>>PHPとかは使えるのですか?

はい。使えます。



>>サーバはApacheを想定されているようですが、2系なのか1系なのか、無限ループと言っていますから1系のような気はしますが、その場合だと2系に変更できないか等、細かな記述の仕方をうんぬんする前の解決策があるようにも思います。

レンタルサーバーなので、Apacheを2系に変更するということは出来ないとおもいます。



>>とりあえず、1系を考えているのなら、mod_rewriteではなく素直に、ページに細工するか、.httaccessに細工して飛ばすことをかんがえましょう。

理解が足りなかったようです。「mod_rewriteをhtaccessに記述する」といったニュアンスで解釈しておりました。

方法としては、htaccessに記述する方法で解決したいと思っています。



>>無限ループとのことですが、DirectoryIndexからindex.htmlは除いてありますよね。除いてないと、?http://www.hoge.com/index.html?を渡す、からとぶ→?http://www.hoge.com/?に転送→?http://www.hoge.com/index.html?を渡す、から飛ぶ→の無限ループになるのはお分かりいただけると思うのですが。

なるほど!と思い、DirectoryIndexからindex.htmlを除くと、ディレクトリが丸見えになってしまいました。

なお、index.htmlはトップページで使っていますので、除いちゃうとおかしくなりませんか?



結構、簡単な記述で解決できちゃうような気がしているのですが、mod_rewriteのページを読むとどんどん深みにはまっていきます。


RewriteEngine on
RewriteCond %{REQUEST_URI} (.*/)index\.html?$
RewriteRule .* %1 [R=301,L]

このソースが近いと思っています。

  
このQ&Aは役に立ちましたか?(役に立った:4件)

このページのトップへ

Facebook公式ページ

公式Twitter