HeavyBommer@blog
時事ネタ、コンピュータ、家電、プログラミング等々、思ったこと/考えたこと/提案/使用レポ/Tipsなどを思いついたときに書いてゆきます
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
mod_rewriteで相対パス的なジャンプ
Apacheのmod_rewriteでURLを書き換えて、Locationで別のディレクトリに飛ばすというような方法です。

たとえば、

DocumentRoot ─┬─ foo ─ index.php
└─ bar ─ index.php

というようなディレクトリ構造の場合に、
http://www.mydomain.jp/foo/index.php?param=FOOBAR
でアクセスすると、
http://www.mydomain.jp/bar/index.php?param=FOOBAR
に飛ばすというようなことをやりたいとします。

httpd.confやDocumentRoot直下に.htaccessを置けるのなら簡単なのですが、今回の場合はfooディレクトリに.htaccessを置かざるを得ないという場合です。

具体的に言うと、fooがケータイ(ガラケー)専用のディレクトリで、ケータイ以外(スマフォやPC)でfooディレクトリ内のファイルにアクセスしてくると、barディレクトリの同名ファイルに飛ばすというようなことをやりたい場合です。
この場合、RewriteCondでIPアドレスなどをもとに飛ばすかどうか判定してしまうので、DocumentRootに.htaccessを設置するわけにもいきません。

・解決策1
RewriteRule ^(.*)$ /bar/$1 [R=302,L]
ディレクトリが固定ならこれでOKですね。
単純です。

ただ、今回の場合は、DocumentRoot以外に複数のAliasがあって、それぞれロゴやちょっとしたローカライズを施したページを保持していて、各Alias格納先は、基本的にシンボリックリンクでDocumentRootのファイルをリンクしているのです。
.htaccessに上のように書いてしまうと、Aliasしている先でそれぞれ.htaccessを修正せねばならず、ケータイGWサーバのIPアドレス帯が追加されると、全部の.htaccessを修正しないとならないという問題が生じます。

かといって、
RewriteRule ^(.*)$ ../bar/$1 [R=302,L]
のように相対パスを使うと、実ディレクトリで解決されてしまうので、うまく動きません。

・解決策2
そこでいろいろ試行錯誤した結果、いったんREQUEST_URIで置き換えてしまえば問題ないことに気づきました。
問題なのは、RewriteRuleに入力されるURLが.htaccessの設置されているディレクトリ基準となっていることだったので、これでいくらでも弄れるわけです。
つまり
RewriteRule ^.*$ %{REQUEST_URI} [C]
RewriteRule ^(.*)/foo/(.*)$ $1/bar/$2 [R=302,L]

と二段階で変換するわけです。

これだと、
http://www.mydomain.jp/foo/index.php?param=FOOBAR → http://www.mydomain.jp/bar/index.php?param=FOOBAR
http://www.mydomain.jp/alias1/foo/index.php?param=FOOBAR → http://www.mydomain.jp/alias1/bar/index.php?param=FOOBAR
のような感じになるので、.htaccessはシンボリックリンクでうまく動いてくれます。

何か弊害がないかがちょっと心配なのですが、今のところ特に問題は出ていません。
スポンサーサイト

テーマ:webサイト作成 - ジャンル:コンピュータ

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。