グラントの答えを「はい、それはほとんど期待どおりに機能します」に修正します。
具体的にmod_rewrite
は、既存のクエリ文字列に関する の動作は驚くべきものです。例として、指定した URL を変換する次のルールを見てみましょう。
RewriteRule /contact /index.php?p=contact
これは に正しく書き換え/contact
られ/index.php?p=contact
、 からページ名にアクセスできるようになります$_GET['p']
。ただし、ページ名以外のパラメーターを使用するスクリプトでこの手法を使用すると、少し複雑になります。この規則は にも変換/contact?person=Joe
され/index.php?p=contact
ます。パラメータが完全にperson=Joe
消えます!これに対処するには 2 つの方法があります。
最も簡単な方法は[QSA]
、ルールで ("query string append") フラグを使用することです。これにより、ルールで指定されたパラメーターの後/contact?person=Joe
に元のクエリ文字列が配置され、次のように変換され/index.php?p=contact&person=Joe
ます。
RewriteRule /contact /index.php?p=contact [QSA]
ただし、これにより、p=
パラメーターが上書きされる可能性があります。Visiting/contact?p=about
は に書き換えられる/index.php?p=contact&p=about
ため$_GET['p']
、スクリプトでは「contact」ではなく「about」が返されます。これを解決するには、QUERY_STRING
代わりに次の変数を使用します。
RewriteRule /contact /index.php?%{QUERY_STRING}&p=contact
これにより、訪問者が URL をいじっているかどうかに関係なく、このルールを使用すると常に「連絡先」が返されること$_GET['p']
が保証されます。:-)