- ベストアンサー
mod_rewriteについて
http://www.example.com/abc/ でアクセスされたら、 ~/main/abc/配下を見に行って、表示させたいのですが、.htaccessはどのように記述すればいいでしょうか? RewriteRule ^/(.*)/$ http://www.example.com/main/$1/ とかでいろいろしたのですが、だめでした。 また、 http://www.example.com/main/abc/ が実行されると http://www.example.com/abc/ にリダイレクトもしたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> の記述のみでは足りないでしょうか? 上3行だけでは動作しません。 これは「/main/abc/でアクセスされた場合は/abc/へリダイレクト」、Ano3下3行が、「/abc/ でアクセスされた場合、URLはそのままで内容は/main/abc/を表示」させるものです。 試してみればお分かりかと思いますが、上3行だけですと、当然ながら /main/abc/ ==> http://example.com/abc/ に飛ばされますが、実際には存在しないディレクトリですのでNotFoundになります。 /abc/の時 /main/abc/を表示させるなら2種類の処理が必要です。 効かないサーバが多いようですが、ダメ元で [NSA,R] =>[NS,QSA,R] のようにNSオプションを入れてみてもいいでしょう。 念のため;; RewriteEngine on RewriteBase / の2行が#Ano3 の前に記載されているか確認してみてください。 また、 RewriteCond %{REQUEST_URI} ^/(abc|aaa|bbb|ccc|ddd)/ はサンプルとして書いたもので、実際には /main/下に本当に存在し、リダイレクトさせたいディレクトリ名を記述します。
その他の回答 (4)
- JaneDue
- ベストアンサー率75% (263/350)
こちらではご希望通り動作するのですが・・・。 ■http://www.example.com/abc/ の場合 URLはそのままで、内容は /main/abc/以下 (の同名ファイル)を表示 ■http://www.example.com/main/abc/ の場合 URLは http://www.example.com/abc/ になり、内容は/main/abc/を表示 となりませんか? Not Foundということなのでループはしていないようですが、/main/ディレクトリに abcディレクトリ(または指定ファイル)は存在するのですよね?。 すみませんが先のシンボリックリンクとこれ以外の方法は思いつきません。時間も経過し他の回答もあまり望めないので再投稿した方がよいかもしれません。
お礼
ご回答ありがとうございます。 そちらでは動くのですね。 RewriteCond %{REQUEST_URI} ^/main/(.*)$ RewriteCond %{HTTP:My_Redirect} !yes RewriteRule ^main/(.+)$ http://example.com/$1 [QSA,R] の記述のみでは足りないでしょうか?
- JaneDue
- ベストアンサー率75% (263/350)
ちょっと面倒ですがこんな感じでしょうか。(NSオプションが効かない場合も多く、無理やりHTTPヘッダでFlagを出して判定しています。) # /main/で始まり、My_Redirectヘッダがyesでない場合、リダイレクト RewriteCond %{REQUEST_URI} ^/main/(.*)$ RewriteCond %{HTTP:My_Redirect} !yes RewriteRule ^main/(.+)$ http://example.com/$1 [QSA,R] # 仮想ディレクトリ名 なら Flag(My_Redirect)を出して /main/を表示 RewriteCond %{REQUEST_URI} ^/(abc|aaa|bbb|ccc|ddd)/ RequestHeader set My_Redirect yes RewriteRule ^(.*)$ /main/$1 [QSA,L] (ドキュメントルート/.htaccess )
お礼
ありがとうございます。 早速上記のものをためしたのですが、Not Foundとなりました。 http://www.example.com/abc/ でアクセスされたら、 URLは、http://www.example.com/abc/のままで、 http://www.example.com/main/abc/ の内容を表示したいです。
- JaneDue
- ベストアンサー率75% (263/350)
※訂正 /abc/ => /main/abc/なら RewriteRule ^(.*)$ /main/abc/$1 [QSA,L]
補足
ご回答ありがとうございます。 シンボリックリンクでできることを確認しました。 ただ、そうするとルートに大量のシンボリックリンクができてしまうため、なんとかmod_rewriteで対応したいです。 やはり難しいでしょうか。
- JaneDue
- ベストアンサー率75% (263/350)
どちらか一方ならいいのですが、/abc/ <=> /main/abc/ となると AならBへ => BならAへ => AならBへ => BならAへ … と、無限ループに陥ってしまいます。 「本体は/main/abc/に置きたい。けれどURLは/abc/にしたい」ということですよね? mod_rewriteでごちゃごちゃやるよりもシンボリックリンクにするとよいでしょう。 ■1. /main/abc/ のシンボリックリンク /abcを作成 ■2. /main/abc/.htaccessでは RewriteCond %{REQUEST_URI} ^/main/abc/ RewriteRule ^(.*)$ http://example.com/abc/$1 [QSA,R] とすればよいでしょう。 ご参考: http://www.nishishi.com/blog/2008/05/symbolic_link.html ※ちなみに/abc/ => /main/abc/ なら RewriteRule ^(.*)$ http://example.com/main/abc/$1 [QSA,L]
お礼
ありがとうございます。 教えてくださった6行の記述でできました。 度々もうしわけないのですが、 (abc|aaa|bbb|ccc|ddd)の部分ですが、ディレクトリが増えるごとに追加しなくてはならないのですが、ディレクトリが増えてもここに記述しなくてすみようにはなりますでしょうか?
補足
あと、 http://example.com/main/abc/ とアクセスされた場合に、 http://example.com/abc/ にして表示するようにはできなかったのですが、いかがでしょうか。 ただし、http://example.com/main/abc/で表示はできています。