9

もちろん、サイトのコンテンツにわかりやすい URL をユーザーに提供するのはよいことです。しかし、それを行う最善の方法は何ですか?foo.com/users/alice のようなものには多くの利点がありますが、最も重要なのは、ルート名前空間を乱雑にしないことです。しかし、ユーザーにとってのシンプルさがすべてに勝ると思います。多くの大規模サイトは同意しているようです (friendfeed、delicious、flickr が思い浮かびます)。この質問は、サーバー側でそれを実現する方法に関するものです。

alice の実際の URL が foo.com/userpage?user=alice であり、誰かが存在しないユーザー ページ (たとえば foo.com/bob) にアクセスしようとすると、foo.com/createnew?user=bob に到達する必要があるとします。 .

もちろん、ユーザーは上記の醜い「実際の」URL を見るべきではありません。foo.com/alice または foo.com/bob だけです。また、ルート名前空間が共有されていることに注意してください。たとえば、foo.com/help は foo.com/userpage?user=help に変換されるべきではありません。

おそらく私はいくつかの単純な mod_rewrite ルールを求めていますが、おそらく私が考えていない、これとはまったく異なるアプローチがあるでしょう。いずれにせよ、この一般的な質問に対する決定的な解決策または「ベスト プラクティス」の解決策を記録するのは良いことだと思いました。

PS: alice.foo.com や users.foo.com/alice など、他の代替案のメリットについて自由にコメントしてください。

PPS: この問題が他の質問で議論されているのを見たことがあると思いますが、検索するのは難しいようです。ポインタ歓迎!もちろん、これをより検索しやすくするための追加のキーワードも同様です。キーワード: ユーザー空間、グローバル名前空間、URL 名前空間。

4

2 に答える 2

6

私はそれがあなたのサイトがどれだけユーザー中心であるかに依存すると思います。

myspaceのようなサイトはhttp://www.myspace.com/jim/です。これは、サイトが完全にユーザーを中心に展開しているためです。

ただし、登録はできるが重要でも必須でもないブログやニュースサイトは、次のようなメリットがあります。

http://www.news.com.au/users/jim/

ユーザーと一緒にWebサイトを運営している場合、MVCデザインパターン、または少なくともルーターを使用してURIを送信する一般的なMVCフレームワークの恩恵を受けることができると思いますか?

そのURIがルーターを経由してUsersControllerに送信された場合は、ユーザーのプロファイルを表示するか、そのユーザーを作成するようにユーザーに指示するかを決定できます。存在しないファイルへのすべてのリクエストをindex.php(またはサーバー側言語のデフォルト)に送信する1つのルールを作成する場合を除いて、mod_rewriteをいじくり回す必要はありません。

mod_rewriteを使用したい場合は、これらのルールを試してください

RewriteEngine On
RewriteCond %{REQUEST_URI} !(home|contact|about) [NC] // this line may be incorrect
RewriteRule ^/users/([^/]+)/?$ userpage?user=$1 [NC,L]

Gumboによって提案された主要なカラットに注意してください。TLDの/users/にのみ一致します。

これは、foo.com / users/bobのようなものにオプションの末尾のスラッシュを付けて一致します。大文字と小文字は区別されず、最後に適用されるルールになります。

リクエストが届き、$ _ GET ['user']がDBに存在しない場合は、次のような方法を試すことができます。

$user = $_GET['user'];

if (!user_exists($user)) {

    header('Location: createnew?user=' . urlencode($user));
    exit();

}

次に、createnewページで、次のようにします。

<input type="text" name="username" value="<?php echo htmlspecialchars(urldecode($_GET['user'])); ?>" />

これにより、ユーザー名に、プロファイルにアクセスしようとしたユーザー名が自動的に入力されます。

PHPとMVCについて詳しく知りたい場合は、Google検索を試すか、StackOverflowで質問してください。

于 2009-04-23T04:43:03.240 に答える
3

次のルールは、サーバー上のファイルまたはディレクトリではないことを条件として、foo.com/bar の形式の URL を foo.com/userpage?user=bar に書き換えます。以下を .htaccess に入れます。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ userpage?user=$1 [NC,L]
</IfModule>

Alex の回答のように、ユーザーが存在しない場合、userpage スクリプトは createnew にリダイレクトする必要があります。

$user = $_GET['user'];
if (!user_exists($user)) {
  header('Location: createnew?user=' . urlencode($user));
}

(Knuthが言うように、上記のコードのバグに注意してください-私はそれが正しいことを証明しただけで、試したことはありません。実際に機能することを確認したら、この回答を更新します。) PS:確認済み!

于 2009-04-24T01:05:52.697 に答える