通过 mod-rewrite 创建数千个 url

Posted

技术标签:

【中文标题】通过 mod-rewrite 创建数千个 url【英文标题】:creating thousands of urls through mod-rewrite 【发布时间】:2012-10-03 15:49:10 【问题描述】:

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

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

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

欢迎所有帮助。

【问题讨论】:

【参考方案1】:

您可以使用以下方法重写所有未映射到现有文件的 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'] 获取实际 URL。这是一个例子:

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

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

【讨论】:

【参考方案2】:

你可以这样使用:

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

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

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

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

【讨论】:

您的重写规则将匹配每个请求,因此不会提供实际文件(.css.js.jpg 等)。可能不是 OP 想要的。【参考方案3】:

我会将 Ross Smith 和 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。需要打开RewriteEngine 后的前 4 行,以便站点的其余部分可以继续运行(检查目录、文件、链接),如果 url 是一个,则使用第一条规则,不再处理。然后第二条规则是,如果它不是之前的规则之一,并重定向到您的“profile.php”页面。

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

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

然后从那里出发。

【讨论】:

我还想补充一点,如果您计划稍后添加更多规则,您现在应该尽可能具体地使用您的RewriteRule。因此,将RewriteRule ^(.*)$ profile.php?user=$1 [NC,L] 更改为RewriteRule ([a-zA-Z]+)\.([a-zA-Z]+)\.([0-9]+)$ profile.php?fname=$1&amp;lname=$2&amp;uid=$3 [NC,L] 并通过脚本中的$_REQUEST['fname']$_REQUEST['lname']$_REQUEST['uid'] 访问它们。它还将确保格式符合您的期望,并将 URI 限制为具有您期望的 PHP 字符集。 我终于有时间实现这个了,你的回答很有用!谢谢。 为什么投反对票?如果您要对某事投反对票,请至少发表评论说明原因。

以上是关于通过 mod-rewrite 创建数千个 url的主要内容,如果未能解决你的问题,请参考以下文章

Apache服务器下phalcon项目报Mod-Rewrite is not enabled问题

codeigniter中的mod-rewrite问题

mod-rewrite递归循环

创建一个每秒能够处理数千个请求的 TCP 套接字服务器

IIS 托管的 WCF 服务创建了数千个临时文件夹

Amazon-SQS + Django-Celery 创建了数千个队列(每条消息一个队列)