2011-06-24 20 views
1

私はPHPで書かれた非常に複雑なコンテンツ管理システムを持っています。これは無制限の階層カテゴリを持っています。htaccess:無制限のサブディレクトリの書き直し

各カテゴリは、このアプローチの問題は、各カテゴリに一意必要とされていることを例

http://www.mysite.com/categories/january

ため、私はきれいなURLを生成するためのmod_rewriteで使用(動的カテゴリのタイトルから生成された)短縮名を有しますそれが正しく機能するための短い名前。カテゴリが異なる複数のカテゴリが同じ名前である場合、問題が発生します。/categories/2011/januaryおよび/ categories/2010/januaryにあります。

これを克服する最も簡単な方法は、重複した短い名前が作成されたときに-1、-2などを追加することですが、URLにカテゴリ階層全体を使用して、例えば http://www.mysite.com/categories/2010/january

http://www.mysite.com/categories/2011/january私の質問はこれです:私は、おそらく値の配列として、サブカテゴリの任意の数を解析して、私のPHPページにこれらを返すためのmod_rewriteを使用することができます方法はありますか?

サブカテゴリの数にかかわらず動作する必要があるため、たとえばサブカテゴリを処理できます。同じコードで

http://www.mysite.com/categories/products/sheds/reports/2011/january

、そして私のPHPページにそれらがURLに示されている順序でこれらのカテゴリの配列を与えますか?

これで、私のコードは、最後のカテゴリから後ろ向きに作業して、親に基づいてどのカテゴリが必要かを判断する必要があります。

これは実現可能な(そして実際に推奨される)ものです。誰かがregexをかなり期待していないとすれば、rewriteコマンドの正しい正規表現を生成する手助けをすることができますか?事前 で

多くのおかげでニック

答えて

3

私はmod_rewriteのがあなたのためにデータを分割できるようにする簡単な方法があるとは思いません。もちろん、最大9つのバーチャルパスに一致するRewriteRuleを構築することができますが、これは参考にならないと思います。代わりに、私はこれが(は必要十分でないはず、この

RewriteRule ^categories/(.*)$ category-handler.php?cat=$1 

のようなルールを定義し、PHPファイルに分割(再発注)を行うには、この

$cat = $_GET['cat']; 
$splittedCat = array_reverse(preg_split('/\//', $cat)); 
+0

のようなものをお勧めします高価な 'preg_ *'関数): '$ splittedCat = explode( '/'、$ cat);'。しかし全体的に - 私は同意します、そのようなルーティングは、Apacheのmod_rewriteがこれをうまく実装することができないため、PHPで実装する方がはるかに優れています(1つの可能なアプローチは '[N]'ループです)実際のサンプルテストが必要です)。私は確かに知っている - これは、Helicon ISAPI_Rewrite 3を使って行うことができます(これはmod_rewriteに似ています)。私は自分自身で行いました(ループのための特別なフラグがあります)。 +1 – LazyOne

+0

jCoderに感謝します - 何らかの理由で、PHPの分割を行うカテゴリ全体の文字列を渡す単純な原則が私を完全に逃しました!これは良い解決策であるはずです。 – Nick

関連する問題