Mod_Rewrite基于数据库查询

时间:2011-01-21 15:09:45

标签: php .htaccess

我希望得到我需要用来解决以下问题的步骤和概念(而不是特定代码)。

我有一个LAMP网站,提供目前作为 www.site.com/profile.php?id=user_id 提供的个人资料。我想要的是 www.site.com/uniqueusername 。我已经阅读了.htaccess mods上的几个主题,但我认为我的情况有点不同。我需要做的是:

  1. 用户请求www.site.com/username
  2. 服务器查询数据库并将用户名与相应的user_id匹配
  3. 服务器将www.site.com/profile.php?id=correct user_id别名(如果这是正确的术语)发回www.site.com/username
  4. 该网站目前使用电子邮件地址作为登录的唯一标识符,该标识符与用户ID匹配。我希望在注册过程中添加一个用户名字段,用于用户个人资料页面的URL。

    正如我之前所说,我将非常感谢您对完成上述任务所需的概念和步骤的任何帮助。

2 个答案:

答案 0 :(得分:4)

我不是关于.htaccess文件的专家,但我可以向你解释我将如何做这件事,即使这可能不是最好的解决方案,它应该运作良好。

首先,你需要以一种接受用户名而不是用户id作为参数的方式制作profile.php文件,所以像profile.php?u = username。这是为了避免第2步,因为我似乎没有必要(如果用户名是唯一的,则不需要查询用户ID)。

然后,您编写一个简单的.htaccess规则,如

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([a-zA-Z0-9]+)/$ profile.php?username=$1

前两个条件检查请求的路径是否不是现有文件或目录,以下规则重写URL(如果以前的条件是假的,当然)

注意

我输入了一个尾部斜杠,因为我使用了另一个规则,它为每个请求添加了一个尾部斜杠(这是为了避免重复的内容有一个不同的页面,一个没有斜杠)。就是这样:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(.*)/$ # check if the URL already ends with a slash
RewriteRule ^(.*)$ http://website.com/$1/ [L,R=301]

当然,如果需要,您可能需要添加其他条件,但我想这是解决问题的一般方法

答案 1 :(得分:1)

这是一个非常简单的问题(一旦你知道了这些步骤)。

请记住,当mod_rewrite重写对本地网址的请求时,默认行为是在内部执行。

因此,有了这条规则:

RewriteEngine on
RewriteRule ^/([a-zA-Z0-9]+)$  /profile.php?id=$1

您将自动让/profile.php捕获传递的id。

由于Web客户端(例如,浏览器)不是更明智的,因此从PHP脚本返回的任何内容都将直接发回到浏览器,而不会出现进一步的问题。

用户甚至不知道你在使用PHP(除非你发送一个标题,他们懒得看)。

在PHP脚本中,它很简单:

<?php
    $id = trim(isset($_GET['id']) ? $_GET['id'] : '');

    if(empty($id))
    {
       die('User not found');
    }

    // look up in db, etc...
    // render page