2012-03-11 8 views
0

私は専門家から助けが必要です。URL Mod-Rewrite IDで新しいページを取得

私はいくつかの書き換えルールがあります。

post.php go to http://example.com/post/3/ 
RewriteRule ^post/([A-Za-z0-9-]+)/?$ post.php?id=$1 [NC,L] 

それは働きます!このよう

しかし、どのように私はポスト/ ID/ 後に新しいページUsers.phpに新しい書き換えルールを追加し、Users.phpでIDを取得することができます(Users.php?ID = 3)

http://example.com/post/3/users

ありがとうございます!

+0

だから '/ post/3 /'は '/post.php?id = 3'に行かなければなりません。それは動作します。しかし、 '/ post/3/users/'も' /Users.php?id = 3'に行くべきですか? – Kaz

答えて

3

/post/3/users//Users.php?id=3にする場合は、そのルールを既存のルールの前に置く必要があります。あなたの既存のルールは/post/3/'に一致します。これはこの追加ルールが一致するものの接頭辞です。そのルールは後になっても実行されません。

# catch the longer URL first 
RewriteRule ^post/([A-Za-z0-9-]+)/users/?$ Users.php?id=$1 [NC,L] 

# No /users/ on it; rewrite to post.php 
RewriteRule ^post/([A-Za-z0-9-]+)/?$ post.php?id=$1 [NC,L] 

別のこと:あなたの投稿に.htaccessとタグ付けしました。書き換えが.htaccessにあることを意味しますか?その場合は、書き換えが相対的であるため、RewriteBaseを使用する必要があります。なぜそれはあなたのウェブサーバ上のパスとURLの間に1対1の対応を許可しているのでしょうか。

.htaccessのようなディレクトリごとのコンテキストでは、mod_rewriteはURLではなくパス名で動作します。しかし、相対リライトを行うと、パスはURLに変換され、Apacheのリクエスト処理チェーンにフィードバックされ、再度処理されます。パスがURLに変換される方法は、RewriteBaseの内容が前面に追加されます。 RewriteBaseがない場合、愚かなことが起きます。ディレクトリへのパス(RewriteRuleのために削除されたディレクトリは、ちょうど戻されます)!

例:DocumentRootが/var/wwwであるとします。ブラウザがURL /fooを要求するとします。それだけで除去した/var/www/ディレクトリをとり、背中にそれを置く:/var/www/ため.htaccessの内側にあなたが、その後のmod_rewriteはURL /var/www/barを生成しますbarからfoo(とRewriteBaseが設定されていない)書き換える場合はこれをパス/var/www/fooに変換されます。今すぐ動作させることができます:/var/www/を有効なURLにするだけです。例えば、

Alias /var/www /var/www # map /var/www URL to /var/www directory 

でも、それはハッキーです。正しい方法は.htaccessにRewriteBase /を入れることです。したがって、foobarに書き換えられると、それはちょうど/を手に入れ、URL /barになります。これはサーバーにフィードバックされ、再び「自然に」ドキュメント・ルートに戻されます。

私は書き直しを理解する前に、そのようなハックを使用しました。私も/DocumentRootとして使用しました!そのため、ほとんどのURLはパスであるため、すべてがうまくいくようになりました.URLをファイルシステムのパスとは別の抽象と考える必要はありません。しかし、それは危険で馬鹿なことです。

+0

魅力的な作品です!ありがとうございました! – Mark