2011-12-25 11 views
2

これは非常にばかげた質問だと思うので、私は私がmod_rewriteを完全に誤解しているかもしれないと思うので、お詫びします。 mod_rewriteは外部リクエストのみを内部ファイルに変換しますか?

www.domain.com/products/item.php?id=1234 

のmod_rewriteがフレンドリーURLにそれを書き換えることができますが、URLがあるとし

wwww.domain.com/products/item/1234 

(例えば)

だから、私が入力した場合wwww.domain.com/products/item/1234これはwww.domain.com/products/item.php?id=1234に書き換えられ、そのページが提供されます。ファイン。

しかし、www.domain.com/products/item.php?id=1234を入力すると、そのページは配信されますが、フレンドリーなURLに書き換えられません。

私の質問では、自動的に内部ファイル名を書き換えることができますか?たとえば、サイトのすべてのURLは現在www.domain.com/products/item.php?id=1234形式です。ユーザーがこのリンクをクリックするとフレンドリーなURLに書き換えられますか?または、常にフレンドリーなURLでハードコードを行う必要がありますか?

すみませんがごめんなさい!私は親切なURLに非友好的なものを書き換えたいが、非友好的なURLを提供したいので混乱している。無限のリダイレクトループを引き起こすことはないだろうか?

答えて

0

Mod_rewriteはドメイン内のURLを内部的に書き換えることはできませんが、となります(RewriteRuleのPオプションを使用)。ドメインが同じであると仮定すると、クライアントのブラウザをフレンドリURLにリダイレクトするために何かを行うことができます。古いものを使用している場合はフレンドリURLを内部的に古いものに書き換えますが、両方を同じドメインにする必要があります。実際のリクエスト(%{THE_REQUEST})変数を調べる代わりに、内部的に書き換えられるURIを見ることでこれを行います。

は、これは古いURLがフレンドリーなURL

RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /products/item\.php 
RewriteCond %{QUERY_STRING} id=([0-9]+) 
RewriteRule ^products/item\.php$ /products/item/%1? [R=301,L] 

これは、フレンドリーURLを使用する場合は、内部的に書き換えるために使用されているブラウザをリダイレクト:

RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /products/item/[0-9]+ 
RewriteRule ^products/item/([0-9]+) /products/item.php?id=$1 [QSA,L] 
0

Mod_rewriteは、 "none friendly"のURLを友好的なURLに自動的に書き換えません。これを行うには、自分でルールを追加する必要があります。

また、Mod_rewriteはあなたのHTML、CSSなどの中のリンクを変更しません。あなたはそれらを自分で変更する必要があります。

ユーザーが友好的なURLを使用すると、そのURLが書き換えられることは決してありません。 Mod_rewriteは、ユーザーの視点から見ると分かりません。ルールに[R]フラグを追加すると、Apacheがクライアントにリダイレクトを送信します。このようにして、クライアントは書き換えられたURLを見ます。

不愉快なURLをリダイレクトするのは、エンジンの検索に役立つ(リンク腐敗を防ぐためにのみ行うべきですが、それはもっと稀です)。これは、リダイレクトループなしで行うことができます。

ここを見てみると、不公平から恐ろしいURLにリダイレクトされるスクリプトが見つかります。あなたがそれを見つけることができないなら私に知らせてください、そして私は助けます。

関連する問題