/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 /
を入れることです。したがって、foo
がbar
に書き換えられると、それはちょうど/
を手に入れ、URL /bar
になります。これはサーバーにフィードバックされ、再び「自然に」ドキュメント・ルートに戻されます。
私は書き直しを理解する前に、そのようなハックを使用しました。私も/
をDocumentRoot
として使用しました!そのため、ほとんどのURLはパスであるため、すべてがうまくいくようになりました.URLをファイルシステムのパスとは別の抽象と考える必要はありません。しかし、それは危険で馬鹿なことです。
出典
2012-03-11 22:16:21
Kaz
だから '/ post/3 /'は '/post.php?id = 3'に行かなければなりません。それは動作します。しかし、 '/ post/3/users/'も' /Users.php?id = 3'に行くべきですか? – Kaz