foo.com/alice vs. foo.com/users/alice - PullRequest
       43

foo.com/alice vs. foo.com/users/alice

8 голосов
/ 23 апреля 2009

Конечно, приятно давать пользователям удобные URL-адреса для их контента на вашем сайте. Но как лучше это сделать? Foo.com/users/alice имеет много преимуществ, и самое главное, что вы не загромождаете свое корневое пространство имен. Но я думаю, что простота для пользователей превосходит все это. Похоже, что многие крупные сайты согласны (на ум приходят дружественные, вкусные и flickr), и этот вопрос о том, как этого добиться на стороне сервера.

Давайте предположим, что реальным URL для Алисы является foo.com/userpage?user=alice и что если кто-то пытается перейти на несуществующую пользовательскую страницу (скажем, foo.com/bob), он должен перейти на foo.com/createnew? пользователь = боб.

Пользователь, конечно же, никогда не должен видеть уродливые "настоящие" 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.

Ответы [ 2 ]

5 голосов
/ 23 апреля 2009

Я бы сказал, что это зависит от того, насколько ориентирован пользователь на ваш сайт.

Сайты, подобные myspace, http://www.myspace.com/jim/, потому что сайт полностью вращается вокруг пользователя.

Тем не менее, блог или новостной сайт, где вы можете зарегистрироваться, но это не важно или не обязательно, может принести пользу

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

Как вы думаете, если вы создаете веб-сайт с пользователями, вы могли бы извлечь выгоду из шаблона проектирования MVC или, по крайней мере, из популярной инфраструктуры MVC, которая использует маршрутизатор для направления URI?

Если этот URI поступил через маршрутизатор, а затем был отправлен в UsersController, вы можете либо показать профиль пользователя, либо направить его на создание этого пользователя. Вам не нужно будет возиться с mod_rewrite, кроме как для создания одного правила, которое направляет все запросы к несуществующим файлам в index.php (или любой другой язык по умолчанию на стороне сервера)

Если вы хотите использовать mod_rewrite, попробуйте эти правила

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

Обратите внимание на начальный карат, предложенный Gumbo, поэтому он соответствует только / users / только TLD.

Это будет соответствовать чему-либо как foo.com/users/bob с дополнительной косой чертой. Он не учитывает регистр и будет последним применяемым правилом.

Если запрос приходит и $ _GET ['user'] не существует в вашей БД, вы можете попробовать что-то вроде этого

$user = $_GET['user'];

if (!user_exists($user)) {

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

}

Затем на странице создания новой, просто сделайте что-то вроде этого

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

Это автоматически заполнит имя пользователя тем именем, с которым они пытались получить доступ к профилю.

Если вы хотите узнать больше о PHP и MVC, попробуйте поиск в Google или задайте вопрос здесь о переполнении стека.

3 голосов
/ 24 апреля 2009

Следующие правила переписывают URL-адрес в форме foo.com/bar на условное обозначение 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>

Как и в ответе Алекса, скрипт пользовательской страницы должен перенаправить на createnew, если пользователь не существует:

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

(Как говорит Кнут, остерегайтесь ошибок в приведенном выше коде - я только доказал, что это правильно, а не пробовал. Я обновлю этот ответ, когда я фактически подтвердил, что он работает.) PS: ПОДТВЕРЖДЕН!

...