2011-01-21 9 views
1

私は、以下の問題を解決するために必要な手順と概念を(特定のコードとは対照的に)得ることを望んでいます。データベースクエリに基づくMod_Rewrite

私は現在、www.site.com/profile.php?id=user_idとして提供されている個人プロフィールを提供するLAMPサイトを持っています。代わりに私はwww.site.com/uniqueusernameが欲しいです。私は.htaccess改造でいくつかのスレッドを読んだことがありますが、私のケースは少し異なると思います。

  1. ユーザー要求が
  2. Serverがデータベースを照会www.site.com/usernameとuser_idの対応
  3. サーバにユーザ名と一致するwww.site.com/送り返し:私は何を達成するために必要なのは以下のとおりです。 profile.php?id =正しいuser_idのエイリアス(正しい用語である場合):www.site.com/username

このサイトでは現在、ユーザーに一致するログインの一意の識別子として電子メールアドレスを使用していますid。私は、ユーザープロファイルページのURLで使用される登録時にユーザー名フィールドを追加したいと考えていました。

私がこれまで述べたように、私が前に述べたように、私が上で詳述した課題を達成するために必要な概念とステップについては、

+0

あなたのサイトには、ユーザーページ以外のページを持っているのだろうか?もしそうなら、私はルートの名前空間 – Brian

答えて

4

私は、.htaccessファイルについての専門家ではありませんが、これはおそらく最良の解決策ではないとしても、どうすればこのことができるか説明できます。

まず、profile.php?u = usernameのようなもので、ユーザーIDの代わりにユーザー名を受け入れるようにprofile.phpファイルを作成する必要があります。これはステップ2を避けるためです(ユーザー名がユニークである場合は、ユーザーIDを照会する必要はありません)。要求されたパスが既存のファイルまたはディレクトリでない場合、次に

は、あなたが最初の2つの条件をチェックし

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

RewriteRule ^([a-zA-Z0-9]+)/$ profile.php?username=$1 

のような単純な.htaccessのルールを記述し、次のルールが以前の条件がある場合(URLを書き換え私は(これはデュを避けるためです行われるすべての要求に末尾にスラッシュを追加する別のルールを使用しているため)もちろん、偽

NOTE

私は最後のスラッシュを入力しますスラッシュを含む異なるページ1を有するplicateコンテンツ)。これは、次のとおりです。

もちろん
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !(.*)/$ # check if the URL already ends with a slash 
RewriteRule ^(.*)$ http://website.com/$1/ [L,R=301] 

必要な場合は、他の条件を追加する必要があるかもしれませんが、私はこれが問題

+1

ジャックを接続するのではなく、サブディレクトリにユーザーを配置することをお勧めします。私が本当に感謝しているコードに感謝していますが、私が自分自身を打つようにしたのは、ユーザ名がuser_idと一意であるという考えでした。なぜなら、単純にprofile.phpページをユーザ名代わりに。私は問題のコードにその問題を合理的に考えることを完全に無視してしまった。再度、感謝します。あなたは大きな助けをしてきました。 2時間の脳の崩壊は10分以内に解決されました。このサイトは非常に貴重です。再度、感謝します。 – Michael

+0

私はこの答えは、いくつかの良いテクニックを指摘しながら、過度に複雑で不必要なコンポーネントがあると信じています。 URLは 'http:// www.site.com/username'で、スラッシュをつけないでください。 (彼が上で指定した通り)。これにより、 'RewriteCond'と301のリダイレクトが不要になります。 – gahooa

+0

@マイケル:あなたは大歓迎です、できるだけ手伝ってうれしいです。 @gahooa:まあ、これは当てはまりますが、ユーザーがsite.com/username/にアクセスしようとしたときに404エラーが発生しないようにするためです。このコードはちょうど両方のバージョンを受け入れます –

1

あなたが知っていれば、これは(非常に単純な問題であるとの良好な一般的なアプローチであると思いますステップ)。

mod_rewriteがローカルURLにリクエストを書き換えたとき、デフォルトの動作は内部的に行うことです。

したがって、この規則に:

RewriteEngine on 
RewriteRule ^/([a-zA-Z0-9]+)$ /profile.php?id=$1 

あなたは自動的に渡されたIDをキャプチャ/profile.phpています。

ウェブクライアント(ブラウザなど)はそれほど賢明ではないので、そのPHPスクリプトから返されたものは、の直後にをブラウザに送信しても問題は発生しません。

ユーザーはあなたがPHPを使用していることさえ知りません(ヘッダーを送信し、見た目が気になる場合を除きます)。 PHPスクリプトで

、それは簡単です:

<?php 
    $id = trim(isset($_GET['id']) ? $_GET['id'] : ''); 

    if(empty($id)) 
    { 
     die('User not found'); 
    } 

    // look up in db, etc... 
    // render page 
+0

Gahooa、ありがとうございました。私は学習経験のためだけに両方の提案を試してみると思います。 – Michael

関連する問題