5

我正在编写一个网站,该网站有很多用户存储在 mysql_database 中,每个用户在其他字段中都有一个 ID 和 profilename(如jim.button.1 )。我想要一个具有以下结构的 url(通过例如用户 ID 上的 mysql_select 获取配置文件):www.mysite.com/jim.button.1

现在我知道我可以使用 mod_rewrite_rule 来做到这一点,但是对于成千上万的用户,我会得到一个非常大的 .htaccess 文件。顺便说一句,我目前还不是 mod 重写方面的专家,但我了解它是如何工作的。

有没有办法做到这一点,比如一个或两个 mod_rewrite_rules 或者有另一种聪明的方法来完成这个?

欢迎所有帮助。

4

3 回答 3

2

您可以使用以下方法重写所有未映射到现有文件的 URL:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^.*$ index.php [NC,L]
</IfModule>

然后通过$_SERVER['REQUEST_URI']. 这是一个例子:

$parts = parse_url($_SERVER['REQUEST_URI']);
$user = $parts['path'];

有关示例,请参见https://github.com/zendframework/ZendSkeletonApplication/blob/master/public/.htaccess 。

于 2012-10-12T19:32:24.907 回答
1

我会结合罗斯史密斯和 JvdBerg 的,所以你最终会得到类似的东西:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^(.*)$ profile.php?user=$1 [NC,L]
</IfModule>

这将使您的脚本更容易处理,而不必解析整个 URL。打开后的前 4 行RewriteEngine是必需的,以便站点的其余部分可以继续操作(检查目录、文件、链接),如果 url 是一个将使用第一条规则并且不再处理。然后第二条规则是,如果它不是前面的规则之一,并重定向为您的“profile.php”页面。

然后在你的“profile.php”页面中,你可以得到你的值:

list($fname, $lname, $id) = explode('.', $_REQUEST['user']);

然后从那里走。

于 2012-10-14T21:59:23.717 回答
1

你可以使用这样的东西:

RewriteEngine On
RewriteRule ^(.+)$ users.php?user=$1 [QSA,L]

在您的 users.php 中,您可以像这样获取用户:

$user = $_GET['user'];
// do your stuff with the user

您必须对其进行微调以使其与站点的其余部分集成,但您明白了。

于 2012-10-12T19:30:37.490 回答