3

私は次のようなURLを持っていますwww.example.com/mypage.php?id=324

その番号 324 は自動的にインクリメントされ (その人が Web サイトの 324 番目のユーザーであることを意味します)、各ユーザーは独自のユーザー URL を設定できます。これは mysql テーブルに格納されます (英数字のみ)。

たとえば、ユーザー番号 324 のユーザー URL が「ピーター」であるとします。

私はmypage.php?id=324ピーターに置き換えようとしているので、URLは次のように表示できますwww.example.com/peter

しかし、私はまだ内部的に維持したいmypage.php?id=324ので、誰かが入力した場合www.example.com/mypage.php?id=324、リダイレクトすることができますwww.example.com/peter

これはFacebookのようなバニティURLだと思いますか?

私はウェブ全体を検索し、htaccess に関する本を購入しましたが、それでもこれを理解できませんでした。私を助けてください!よろしくお願いします!

4

2 に答える 2

7

URL 書き換えステップバイステップ...

ステップ 1 - クライアント側 URL の外観を決定する

あなたはこの部分を完了しました - あなたはexample.com/peterあなたのユーザーが見ているものになりたいです

ステップ 2 - サーバー側の URL を考え出す

技術的には、ハードコードされた書き換えルールの膨大なリストを作成できます。

RewriteRule ^peter$ mypage.php?id=324
RewriteRule ^alice$ mypage.php?id=325
RewriteRule ^bob$ mypage.php?id=326

しかし、多くのユーザーがいる場合、これは特に効率的ではありません。

mypage.php は ID を受け入れますが、可能なユーザー名を受け入れることができるように変更する必要があります (ただし、あらゆる種類のゴミが含まれていると仮定します)。別のクエリ文字列引数 'hint' を取ることを許可することにしたとしましょう。したがって、次のような URL を取得する必要があります。example.com/mypage.php?hint=peter

スクリプトが理解できないユーザー名に対して 404 応答を生成することを確認してください。

ステップ 3 - クライアント側の URL をサーバー側の URL にマップするための製品書き換えルール

これを行う 1 つの方法は次のようになります。最初のRewriteCond行により、要求が実際のファイルと一致しない場合にのみルールが実行されるようになります。RewriteRuleにより、リクエストは mypage.php によって処理されますが、残りの URL は「ヒント」パラメーターとして渡されます。「qsa」の部分は「query string append」の略で、元の URL に存在するすべてのクエリ文字列が記述されたルールに追加されることを意味します。「l」は「最後」を意味するため、このリクエストを処理するためにそれ以上のルールは呼び出されません。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-z]+)$ mypage.php?hint=$1 [qsa, l]

mypage.php では、ヒントを使用してユーザーを検索します。

パターンをかなり制限していることに注意してください。小文字のシーケンスのみが許可されています。これにより、サイトが生成する 404 ごとにスクリプトが呼び出されないようにすることができます。

于 2012-06-23T08:08:30.793 に答える
3
But I still want to maintain mypage.php?id=324 internally, so if someone types 
www.example.com/mypage.php?id=324, redirected to www.example.com/peter

提案したURLは推奨されていません。次のようなものをhttp://www.example.com/users/peter使用すると、次のような書き換えルールを使用できます。

RewriteRule ^/users/(.*)  /mypage.php?username=$1  [QSA,L]

そして、あなたのmypage.phpで、あなたは試すことができます

<?php

if (isset($_GET["id"])) {
    // Get the $username from DB
    // Do the redirection to http://www.example.com/users/$username if found, 
    // else send 404     
} else if (isset($_GET["username"]) {
    // normal flow with $username
}
于 2012-06-23T08:27:29.197 に答える