11

$_GETURLの書き換えはPHPのパラメーターにどのように影響しますか?

のようなURLがあり、連絡先ページを提供するように指示するためhttp://example.com/index.php?p=contactに使用するとします。URLをに変換する書き換えルールを使用した場合でも、期待どおりに機能しますか?$_GET['p']index.phphttp://example.com/contact$_GET['p']

もしそうなら、なぜそれが機能するのか詳しく説明していただけますか?そうでない場合、ページがリライトの有無にかかわらず機能するように、問題を解決するためにどのような戦略を使用できますか?

4

7 に答える 7

34

グラントの答えを「はい、それはほとんど期待どおりに機能します」に修正します。

具体的に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']が保証されます。:-)

于 2009-02-02T23:39:43.943 に答える
4

はい、それは期待どおりに機能します。

于 2009-02-02T23:00:13.150 に答える
1

URL を書き換えるとき、これは mod_rewrite によって行われます -- 最後に取得されたページは依然として「古い」ページ、つまり index.php?p=contact です。つまり、ブラウザは /contact を取得します。mod_rewrite はそれを index.php?p=contact に書き換えます。このため、スクリプトは書き換えが行われたことを認識しません。「通常の」方法で呼び出されます。したがって、そのような書き換えは機能します。元のブラウザが要求したページとは異なるページを要求する書き換えプロキシと考えることができます。

于 2009-02-02T23:08:24.583 に答える
1

クライアントがhttp://example.com/contactをリクエストすると、サーバーは書き換えルールを使用して、代わりにhttp://example.com/index.php?p=contactを提供します。クライアントは、書き換えられた URL を見ることができず、書き換えられたことさえわからない可能性があります。クライアントとしてどちらの URL を要求しても、まったく同じページが表示されます。

于 2009-02-02T23:08:54.677 に答える
0

/contactURL を からに書き換える/index.php?p=contactので、はい、期待どおりに動作します。

于 2009-02-02T23:02:02.333 に答える
0

ページの一部をレンダリングした後でヘッダーを変更すると、php ページで問題が発生する可能性があるのではありませんか? URLをどのように書き換えていますか?勘違いしてるかも…

于 2009-02-02T23:04:14.093 に答える