人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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ファイルのリンクは手動で変更いたします。



●質問者: nijinohasi
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:ABC hoge HTML mod_rewrite URI
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● bewind
●50ポイント

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]


でどうでしょう。

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

◎質問者からの返答

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

教えて頂いたように、サーバーの設定変更や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階層深くするしか無いのでしょうね


2 ● bewind
●50ポイント ベストアンサー

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


外部スタイルシートの問題は、一つ目の方法では /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 の配置が全然違う話だということであれば、その旨お知らせくださればまた何か考えられるかもしれません。

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

◎質問者からの返答

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

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ