我需要一些关于创建用户个人资料系统的帮助。我希望它像Facebook或Myspace,它只有地址后面的用户名,没有问号或任何东西,例如www.mysite.com/username
。我已完成所有注册,日志记录脚本等,但如何使用上面的URL示例“/ username”转到配置文件?
答案 0 :(得分:7)
您需要创建一个mod重写,它接受第一个目录并将其作为$ _GET参数传递。
试试这个:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)/$ index.php?user=$1
那应该在'/'之后重写任何东西作为index.php?user = directory
答案 1 :(得分:4)
这是我的答案的简略版本,以防任何人有时间:
在该目录中,使用以下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的用户页面。
没有获取黑客可以利用的变量,而且很容易将其放在另一个博客或名片网址上。
实际上,有可能摆脱“?”并有一个很简单的www.example.org/users/someusername。
我在How to Succeed with URLs的Till Quack文章“A List Apart”上了解到这一点。
因此,您需要了解Apache,.htaccess和mod_rewrite,并且此方法确实需要您了解安全风险并对其进行说明。这是基本的想法:
您创建了一个名为“users”的目录(您不必这样做,但这会简化整个过程),并且在该目录中,您将包含mod_rewite的.htaccess文件有效地表示为“所有文件或应该将不属于某种类型的目录请求(图像,pdfs)发送到该脚本,该脚本将处理发送用户的位置。“文章中的mod_rewrite看起来像这样:
RewriteEngine on
RewriteRule !\.(gif|jpg|png|css)$ /your_web_root/index.php
在我的例子中,它将是“/your_web_root/users/index.php”,之所以更简单是因为不是这个脚本处理页面上的所有请求,而是处理用户目录中的那些请求。
然后,你有一个php脚本,上面写着“好吧,给出了什么URL?”并且它基本上抓住了最后一个尾随斜杠之后的部分(或两个,如果最后还有另一个),并且SANITIZES它发现了什么(这真的很重要)并说“这个用户名是否存在于我的数据库中?”如果是,它会将请求者发送到用户的配置文件,但是使用漂亮的URL(我们将在一秒钟内完成),如果没有,则将它们发送到“未找到用户”页面,或者您想要的任何内容。 / p>
因此,如果确实找到了您的用户,PHP脚本将输出用户配置文件(再次确保清理它。您可能拥有的任何混蛋用户都可以 - 如果您给他们机会 - 将恶意代码嵌入他们的自己的个人资料,知道查看个人资料的浏览器将执行该代码)。由于请求的页面是:
www.example.org/users/example_user
由于您使用的是mod_rewrite而不是重定向,因此URL保持不变,而.htaccess文件提取的脚本只会转储用户配置文件。对于访问者,他们只是看到他们输入了上面的网址,用户个人资料显示出来。
您还希望PHP脚本检查用户是否重定向到“未找到用户”页面,而不是简单地让它输出“user_not_found”页面。这是任何人投入的:
www.example.org/users/blabhaboehbohe
会看到网址更改为
www.example.org/users/notfound/
而不是看到URL保持不变。如果黑客看到URL没有改变,他们现在知道你正在使用mod_rewrite,因此必须有一个处理实际输出的脚本。如果他们知道这一点,他们就会开始疯狂地寻找你可能已经打开的每个安全漏洞。
欢呼声。
答案 2 :(得分:2)
看看rewrite engine。一些框架也有类来完成这项工作,例如Zend Framework有Zend_Router你可以使用它。你可以自己使用这个,其他框架也可以使用它们,检查文档中你喜欢的风格。