2013-02-09 10 views
11

この質問は重複している可能性があります。しかし、私の解決策は見つけられませんでした。 私は1つのレベルパラメータと2つのレベルパラメータを持つURLを書き直したいと思います。最初のパラメータはpであり、第二はsp複数のパラメータに対して.htaccessでURLを書き換えます。

www.domain.com/homewww.domain.com/index.php?p=homewww.domain.com/projects/99を指している必要があり、私は.htaccessの中でどのように行うのですwww.domain.com/index.php?p=projects&sp=99

を指している必要がありますか?

現在、私のhtaccessファイルは、このhtaccessファイルと

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?p=$1 
RewriteRule ^([^/]*)/([^/]*)\$ index.php?p=$1&sp=$2 [L] 

問題は、それが正しく1つのレベルのURLを指していることである、としてfollowesです。すなわち、www.domain.com/home。しかし、2つのレベルのURLではありません。すなわち、 www.domain.com/projects/99

答えて

30

ルールは個別に処理する必要があります。ルールに先行するすべての条件は、単一のルールにのみ適用されます。次のルールはそのルールには触れられていません。 2つのルールを「連鎖」しようとしました。最初のルールは構文を変更したキャッチオールだったので、2番目のルールは決して一致しませんでした。それ以外にも、最初のルールが不要なリクエストを捕まえないようにする必要があります。また、正規表現で*または+演算子を使用するかどうかについても考えてください。 +演算子を使用することをお勧めします。そのため、空の値が 'ページ'または 'サブページ'に対して要求されると、明確なエラーメッセージが表示されます。

だから、これはあなたが探しているものに近づくかもしれない:

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)$ index.php?p=$1 [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)/([^/]+)$ index.php?p=$1&sp=$2 [L] 
+0

おかげでたくさんの友人。 – Firnas

+0

ありがとうございました。上記の変更の後、正常に動作しています。しかし、私が第2レベルのURLに行くと、javascriptのsrc、cssのリンク、imgのソースなどの参照が間違っています。第2レベルのURLから相対的にこれらのファイルを探します。これをどうやって解決するのですか? – Firnas

+2

これはクライアント側の問題のように聞こえるでしょう:ほとんどの場合、それらのリソースの相対パスを指定してロードしますか?ブラウザは変更されていないリクエストURLだけを知っているので、リソースをロードしようとすると間違った絶対URLを作成します。だから、サーバーの代わりにブラウザをリダイレクトする必要があります。内部的にリクエストURLを書き直す(醜いので、目に見えるので)か、リソースに対してクリーンなURLを作成する必要があります。通常、これはサーバー側のスクリプトの中にクリーンで健全な 'ベースURL'を定義し、それを使用してロードするリソースの絶対パスを構築することによって行われます。 – arkascha

関連する問題