mod_rewriteを使ってディレクトリを隠す方法を教えてください。


下記のような構成を/abc/と/OPQ/ディレクトリが無いようにアクセスしたい。

hoge.com/abc/xyz/複数ファイル
hoge.com/abc/efg/複数ファイル
hoge.com/abc/lmn/複数ファイル
     ↓
hoge.com/xyz/複数ファイル
hoge.com/efg/複数ファイル
hoge.com/lmn/複数ファイル

/opq/ディレクトリが無いようにアクセスしたい

hoge.com/opq/複数ファイル
     ↓
hoge.com/複数ファイル

このようにディレクトリを隠してURIを短縮するRewriteRuleを教えてください。
これにあわせてHTMLファイルのリンクは手動で変更いたします。

回答の条件
  • 1人2回まで
  • 登録:2006/08/26 08:26:18
  • 終了:2006/08/26 22:32:57

ベストアンサー

id:bewind No.2

bewind回答回数33ベストアンサー獲得回数102006/08/26 21:48:42

ポイント50pt

こちらこそ、確認が遅くなりました。


外部スタイルシートの問題は、一つ目の方法では /css/all.css が /abc/css/all.css に解釈されてしまったんですね。xyz などが見えるのと同階層に対象外のディレクトリ(今回は css)があるのであれば、二つ目の方法でないとだめですね。説明不足で失礼しました。

ついでに、/opq/ の変換ついては、二つ目の方法では /css/all.css が /opq/css/all.css になってしまいますので、一つ目の方法を使ってください。


もうひとつの問題ですが、/index.html と /main.html が今現在どこにあるのかがちょっと不明なんですが、/opq/ 配下のファイルとは別に、/index.html と /main.html があって、/opq/ 配下のファイルと名前がぶつかってしまうという事でしょうか。

とすると、http://hoge.com/index.html がどちらなのかを判別することができないので、1階層深くするなどしないと無理ですね。

名前がぶつかりさえしなければ、

RewriteCond %{REQUEST_URI} !^/index\.html$
RewriteCond %{REQUEST_URI} !^/main\.html$
RewriteRule ^/([^/]+)$ /opq/$1 [L]

などとすれば、列挙したものは書き換えの対象外にすることもできます。

もしかしたら、前記の /css/ の問題も含めて、

RewriteCond %{REQUEST_URI} !^/index\.html$
RewriteCond %{REQUEST_URI} !^/main\.html$
RewriteCond %{REQUEST_URI} !^/css/
RewriteRule ^/(.*)$ /opq/$1 [L]

として、書き換え対象以外でルートにあるものを全て列挙した方がいいかもしれません。

index.html を省略した http://hoge.com/ をどちらにするのかも要確認です。

まぁ、階層を分けるに越した事はないですね…


/index.html と /main.html の配置が全然違う話だということであれば、その旨お知らせくださればまた何か考えられるかもしれません。

(その際は回答回数の見直しもお願いします)

id:nijinohasi

本当に詳しく教えていただいてありがとうございます。

ルート直下に多くのディレクトリとファイルがあるため

今回は1階層深くするほうが簡単なので、そのようにいたします。

新たに教えていただいた方法は、次回のサイト設計で使わせていただきます、ありがとうございました。

機会がありましたらまたよろしくお願いします。

2006/08/26 22:30:56

その他の回答(1件)

id:bewind No.1

bewind回答回数33ベストアンサー獲得回数102006/08/26 10:55:06

ポイント50pt

1階層のディレクトリ配下のファイルにアクセスがあったら /abc/(ディレクトリ)/ 以下に、ルート直下なら /opq/ 以下に書き換えるなら↓


RewriteEngine on

RewriteRule ^/([^/]+)/([^/]+)$ /abc/$1/$2 [L]

RewriteRule ^/([^/]+)$ /opq/$1 [L]


xyz, efg, lmn 決め打ちで /abc/(ディレクトリ)/ 以下に、そうでなければ /opq/ 以下に書き換えるなら↓


RewriteEngine on

RewriteRule ^/(xyz|efg|lmn)/(.*)$ /abc/$1/$2 [L]

RewriteRule ^/(.*)$ /opq/$1 [L]


でどうでしょう。

例に挙げられたものだけであればどちらでもいけるはずですが、用途に応じて選択、組み合わせてみてください。

id:nijinohasi

お返事が遅くなってごめんなさい。

教えて頂いたように、サーバーの設定変更やhtmlファイルのリンク変更をしていました。

まず、RewriteRule ^/([^/]+)/([^/]+)$ /abc/$1/$2 [L]での設定でアクセスすると、

htmlファイルにはアクセスできるのですが、下記のような外部スタイルシートが

リンク切れになり、レイアウトやデザインが崩れてしまいます。

<link href="/css/all.css" rel="stylesheet" type="text/css">

このようにルートからの指定なので??なぜリンク切れになるのか分かりません

それでもうひとつ教えていただいた RewriteRule ^/(xyz|efg|lmn)/(.*)$ /abc/$1/$2 [L]

を使ってみると、こちらは全くリンク切れも起こさず、ベリーグッドです

感謝! 感謝! ありがとうございます。

次にRewriteRule ^/([^/]+)$ /opq/$1 [L]

とRewriteRule ^/(.*)$ /opq/$1 [L]なのですが

ルート直下にも複数のファイルがあります、そのため /index.html も /main.html も

/abc/index.html  /abd/main.html でのリンクになります、これの解決方法は/abc/と同じように

1階層深くするしか無いのでしょうね

2006/08/26 15:08:33
id:bewind No.2

bewind回答回数33ベストアンサー獲得回数102006/08/26 21:48:42ここでベストアンサー

ポイント50pt

こちらこそ、確認が遅くなりました。


外部スタイルシートの問題は、一つ目の方法では /css/all.css が /abc/css/all.css に解釈されてしまったんですね。xyz などが見えるのと同階層に対象外のディレクトリ(今回は css)があるのであれば、二つ目の方法でないとだめですね。説明不足で失礼しました。

ついでに、/opq/ の変換ついては、二つ目の方法では /css/all.css が /opq/css/all.css になってしまいますので、一つ目の方法を使ってください。


もうひとつの問題ですが、/index.html と /main.html が今現在どこにあるのかがちょっと不明なんですが、/opq/ 配下のファイルとは別に、/index.html と /main.html があって、/opq/ 配下のファイルと名前がぶつかってしまうという事でしょうか。

とすると、http://hoge.com/index.html がどちらなのかを判別することができないので、1階層深くするなどしないと無理ですね。

名前がぶつかりさえしなければ、

RewriteCond %{REQUEST_URI} !^/index\.html$
RewriteCond %{REQUEST_URI} !^/main\.html$
RewriteRule ^/([^/]+)$ /opq/$1 [L]

などとすれば、列挙したものは書き換えの対象外にすることもできます。

もしかしたら、前記の /css/ の問題も含めて、

RewriteCond %{REQUEST_URI} !^/index\.html$
RewriteCond %{REQUEST_URI} !^/main\.html$
RewriteCond %{REQUEST_URI} !^/css/
RewriteRule ^/(.*)$ /opq/$1 [L]

として、書き換え対象以外でルートにあるものを全て列挙した方がいいかもしれません。

index.html を省略した http://hoge.com/ をどちらにするのかも要確認です。

まぁ、階層を分けるに越した事はないですね…


/index.html と /main.html の配置が全然違う話だということであれば、その旨お知らせくださればまた何か考えられるかもしれません。

(その際は回答回数の見直しもお願いします)

id:nijinohasi

本当に詳しく教えていただいてありがとうございます。

ルート直下に多くのディレクトリとファイルがあるため

今回は1階層深くするほうが簡単なので、そのようにいたします。

新たに教えていただいた方法は、次回のサイト設計で使わせていただきます、ありがとうございました。

機会がありましたらまたよろしくお願いします。

2006/08/26 22:30:56

コメントはまだありません

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

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

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

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