9

我需要一些有关创建用户配置文件系统的帮助。我希望它像 Facebook 或Myspace一样,地址后面只有用户名,没有问号或任何东西,例如www.mysite.com/username. 我已经完成了所有的注册、日志记录脚本等,但是如何使用上面的 URL 示例“/username”访问配置文件?

4

3 回答 3

7

您需要创建一个 mod 重写,它采用第一个目录并将其作为 $_GET 参数传递。

试试这个:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)/$ index.php?user=$1

那应该将'/'之后的任何内容重写为 index.php?user=directory

于 2009-07-25T00:23:57.483 回答
4

这是我的答案的删节版,以防万一有人知道:

  1. 创建一个名为“用户”的目录。
  2. 在该目录中,使用以下 mod_rewrite 创建一个 .htaccess 文件:

    REQUEST_URIRewriteEngine on

    RewriteRule !\.(gif|jpg|png|css)$ /your_web_root/users/index.php'REQUEST_URI

现在,所有不在用户目录括号中的扩展的页面请求都将转到 index.php

index.php 获取用户输入的 URL,并在最后获取位。有很多方法可以做到这一点,如果您知道最后一部分将始终是用户名而不是用户名/图片/,那么这里有一个简单的方法:

 $url_request = $_SERVER['REQUEST_URI']; //Returns path requested, like "/users/foo/"
 $user_request = str_replace("/users/", "", $url_request); //this leaves only 'foo/'
 $user_name = str_replace("/", "", $user_request); //this leaves 'foo'

现在,只需对该用户名查询数据库即可。如果存在,则 index.php 输出配置文件,如果没有脚本重定向到:/users/404.php

但是,如果用户确实存在,您的访问者将看到的只是他们输入的内容

www.example.org/users/foo/

他们到了 foo 的用户页面。

没有可供黑客利用的变量,以及一个漂亮、易于放在另一个博客或名片上的 URL。


实际上,可以摆脱“?” 并有一个很好的简单 www.example.org/users/someusername。

我在A List Apart上的 Till Quack 的文章“如何使用 URL 取得成功”中了解到这一点。

因此,您需要了解 Apache、.htaccess 和 mod_rewrite,而这种方法确实需要您了解安全风险并考虑它们。这是基本思想:

您创建一个名为“users”的目录(您不必这样做,但这会简化整个事情),然后在该目录中放置包含 mod_rewite 的 .htaccess 文件,该文件有效地表示“所有文件或目录请求不是某种类型的(图像、pdf)应该被发送到这个脚本,它将处理将用户发送到哪里。” 文章中的 mod_rewrite 如下所示:

RewriteEngine on
RewriteRule !\.(gif|jpg|png|css)$ /your_web_root/index.php

在我的示例中,它将是“/your_web_root/users/index.php”,它更简单的原因是因为这个脚本不是处理页面上的所有请求,而是处理用户目录中的请求。

然后,您有一个 php 脚本,上面写着“好的,给出的 URL 是什么?” 它基本上抓住了最后一个斜杠之后的部分(或两个,如果最后还有另一个斜杠),并清理它发现的内容(这非常重要)并说“这个用户名是否存在于我的数据库中?” 如果是,它将请求者发送到用户的个人资料,但带有一个漂亮的 URL(我们将在一秒钟内完成),如果不是,它会将他们发送到“未找到用户”页面或任何您想要的页面。

因此,如果它确实找到了您的用户,PHP 脚本将输出用户配置文件(同样,请确保对其进行清理。您可能拥有的任何混蛋用户都可以 - 如果您给他们机会 - 将恶意代码嵌入到他们自己的配置文件中,知道查看配置文件的浏览器将执行该代码)。由于请求的页面是:

www.example.org/users/example_user

并且由于您使用的是 mod_rewrite 而不是重定向,因此 URL 保持不变,并且 .htaccess 文件提取的脚本只是转储用户配置文件。对访问者来说,他们只是看到他们输入了上面的 url,然后用户个人资料就出现了。

您还希望检查用户的 PHP 脚本重定向到“未找到用户”页面,而不是简单地让它输出“user_not_found”页面。任何投入的人都是这样:

www.example.org/users/blabhaboehbohe

将看到 URL 更改为

www.example.org/users/notfound/

而不是看到 URL 保持不变。如果黑客看到 URL 没有更改,他们现在知道您正在使用 mod_rewrite,因此必须有一个脚本处理实际输出。如果他们知道这一点,他们就会开始疯狂地寻找您可能留下的每个安全漏洞。

干杯。

于 2009-07-25T02:39:28.110 回答
2

看看重写引擎。一些框架也有类来完成这项工作,比如 Zend Framework 有Zend_Router,你可以使用它。你可以自己使用这个,其他框架也有,查看文档以获得你喜欢的风格。

于 2009-07-25T00:42:02.713 回答