2010-11-19 11 views
1

どのようなルールでURLを変換しますか?mod_rewriteルール

host.com/plastic_toys/pink_barbie/
host.com/index.php?q=plastic+toys+pink+barbie

カテゴリと製品名のコンポーネントの数が変わります。

編集:

私はこのルールが仕事の一部をして推測:

RewriteRule ^([^/]*)/([^/]*)$ /index.php?q=$1+$2 [L] 

上記のルールに関する問題は、それが+にアンダースコアを変換するの世話をしないということですので、それは次のように変換しますこの:

host.com/plastic_toys/pink_barbie/
host.com/index.php?q=plastic_toys+pink_barbie

私はその変換をPHPに委譲しなければならないと思います。今、ルールが実際に私が想像するように変換を実行するかどうかをテストする方法はありますか?

答えて

1

まず - 私は、次の規則を使用することをお勧めします:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-zA-Z_]+)/([a-zA-Z_]+)/?$ /index.php?q1=$1&q2=$2 [L,QSA] 

のRewriteCond各静的/help.htmlを持つようにしたい場合は、有効なファイルやディレクトリは、例えば(存在していないことを確認し、それ存在するか、/FAQ/index.phpであり、それが存在するとRewriteRuleは起動しません。

パラメータを2つの項目に分割しました。別々のパラメータとして扱うことができます。 1パラメータだけを/index.php?q=$1-$2またはあなたが望む他の区切り記号に変更します - とにかくその文字を解析したいから+使用しないと言うでしょう)。

+0

条件の説明をありがとうございます。私は 'RewriteRule ^([^ /] *)/([^ /] *)$ /index.php? 'で提案した2行を使って終わりましたか?q = $ 1 + $ 2 [L] 'をルールとして使用し、期待どおりに動作します。 –

0

何もありません。ルールは、カテゴリと商品の間の線をどこに描画するかをどのように知るでしょうか。クエリに3つのパラメータがある場合はどうなりますか?最初の2つはカテゴリであり、最後は製品であり、最初はカテゴリであり、最後の2つは製品である。

+0

製品とカテゴリを区別する必要はありません。両方が 'q'パラメータの値として終了するためです。 –

3

これを完全に書き直すために必要な理由(既存のコードなど)はありますか?

通常、私は

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] 

を行い、その後、$_GET["q"]を解析あるいは単に直接$_SERVER["REQUEST_URI"]を解析します。 preg_match()はあなたの友人です。

この2つの方法のいずれかを使用するには、奇妙な書き換えを試すよりも時間がかかります。

+0

MPDをありがとう、残念ながら、私は書き直しのルールと正規表現の両方を完全に混乱させることがあります。たとえば、私はあなたがこれらの3つの行で何をしているのか分かりません。私は自分の質問を編集しました - あなたが私が最後に含めたルールで私が期待するものを得ることを確認できますか? –

+0

@sobedaiはかなりそれを要約しました。違いは、私のルールが見つからないすべてのファイル/ディレクトリをindex.phpにリダイレクトすることであり、PHPはパラメータをパーサーに分解する責任があるということです。これは基本的にWordpress、DrupalなどのフレームワークがかなりのURLを処理する方法です。 – mpdonadio

関連する問題