如何使用PHP和MySQL创建用户个人资料

9

我需要帮助创建用户配置文件系统。我想要它像 Facebook 或 Myspace 一样,在地址后只有用户名,没有问号或其他任何东西,例如,www.mysite.com/username。我已经完成了所有的注册、登录脚本等等,但是如何使用上面的 URL 示例 "/username" 前往配置文件呢?

3个回答

7

您需要创建一个 mod rewrite 规则,将第一个目录作为 $_GET 参数传递。

可以尝试以下方法:

RewriteEngine On
RewriteBase /

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

这个应该将 '/' 后面的任何东西重写为 index.php?user=directory。


为了安全起见,我添加了条件以确保如果文件存在,它也将被重定向。 - Tyler Carter
将其放入名为.htaccess的文件中,该文件位于您的index.php所在的位置。 - Tyler Carter
有没有办法去掉“?”符号? - Spyderfusion02
你的意思是在生成的字符串上吗?不是的。那是 PHP 和 $_GET 参数的一部分。 - Tyler Carter
你的方法是正确的,Chacha,但是请看一下我关于GET参数的答案。如果您使用mod_rewrite每次都转到相同的脚本,就不会有GET变量,脚本可以解析URL以查找用户名。 - Anthony
显示剩余6条评论

4
以下是我的简略回答,以防有人只想看概要:
1. 创建一个名为“users”的目录。 2. 在该目录中创建一个 .htaccess 文件,并添加以下 mod_rewrite 代码: REQUEST_URIRewriteEngine on RewriteRule !\.(gif|jpg|png|css)$ /your_web_root/users/index.php'REQUEST_URI 现在,对于任何括号中没有的扩展名的页面请求都将前往 users 目录下的 index.php。
index.php 获取用户输入的 URL 并提取其末端部分。有许多方法可以实现此操作,这里提供一种简单的方法,如果您知道最后一部分始终是一个用户名而不是例如 username/pics/ 等,则可以使用此方法。
 $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的用户页面。

没有可供黑客利用的get变量,而且还有一个漂亮、易于放置在其他博客或名片上的URL。


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

我是从Till Quack的文章“如何成功使用URL”中了解到这一点的,该文章发布在A List Apart上。

因此,您需要了解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,并且必须有一个脚本处理实际输出。如果他们知道了这一点,他们可以开始疯狂地寻找你可能留下的每一个安全漏洞。

祝好。


2

看一下重写引擎。一些框架也有类来完成这项工作,例如Zend Framework有Zend_Router可以使用。你可以单独使用它,其他框架也有类似的功能,请查看您所选择的框架的文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接