首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >foo.com/alice vs. foo.com/users/alice

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

Stack Overflow用户
提问于 2009-04-23 04:25:29
回答 2查看 1.5K关注 0票数 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规则,但也许有一些我没有考虑到的完全不同的方法。在任何情况下,我认为记录这个常见问题的最终或“最佳实践”解决方案都是很好的。

附言:请随意评论其他替代方案的优点,如alice.foo.com或users.foo.com/alice。

PPS:我想我已经在其他问题中看到过这个问题,但它似乎很难搜索。欢迎使用指针!当然,还有额外的关键字来使其更具搜索性。关键词:用户空间、全局名称空间、URL名称空间。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-04-24 01:05:53

以下规则将形式为foo.com/bar的URL重写为foo.com/userpage?user=bar,条件是bar不是服务器上的文件或目录。将以下内容放入.htaccess:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
$user = $_GET['user'];
if (!user_exists($user)) {
  header('Location: createnew?user=' . urlencode($user));
}

(正如Knuth所说,要注意上面代码中的bugs -我只是证明了它是正确的,并没有尝试它。当我确认它确实有效时,我会更新这个答案。)PS:确认!

票数 3
EN

Stack Overflow用户

发布于 2009-04-23 04:43:03

我想说这取决于你的网站是如何以用户为中心的。

像myspace这样的网站是http://www.myspace.com/jim/的,因为网站完全是以用户为中心的。

然而,博客或新闻网站,你可以注册,但它不重要或强制性可以受益于

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

你认为如果你正在做一个有用户的网站,你是否可以从MVC设计模式中受益,或者至少是一个流行的MVC框架,它使用路由器来定向URI?

如果URI经过路由器,然后被发送到UsersController,您可以决定是显示用户的配置文件,还是指示他们创建该用户。除了制定一条规则,将对不存在的文件的所有请求定向到index.php (或任何服务器端语言的默认设置)之外,您不需要对mod_rewrite胡乱操作。

如果您确实想使用mod_rewrite,请尝试以下规则

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

请注意Gumbo建议的前导Carat,因此它只与TLD的/users/匹配。

这将匹配诸如foo.com/users/bob之类的任何内容,并带有可选的尾部斜杠。它不区分大小写,并且将是最后应用的规则。

如果请求传入,而数据库中不存在$_GET‘’user‘,则可以尝试如下所示

代码语言:javascript
复制
$user = $_GET['user'];

if (!user_exists($user)) {

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

}

然后在createnew页面上,简单地执行如下操作

代码语言:javascript
复制
<input type="text" name="username" value="<?php echo htmlspecialchars(urldecode($_GET['user'])); ?>" />

这将使用他们尝试访问配置文件时使用的用户名自动填充用户名。

如果您想了解更多关于PHP和MVC的信息,请尝试Google搜索或在Stack Overflow上提出问题。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/780311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档