通过 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&lname=$2&uid=$3 [NC,L]
并通过脚本中的$_REQUEST['fname']
、$_REQUEST['lname']
和$_REQUEST['uid']
访问它们。它还将确保格式符合您的期望,并将 URI 限制为具有您期望的 PHP 字符集。
我终于有时间实现这个了,你的回答很有用!谢谢。
为什么投反对票?如果您要对某事投反对票,请至少发表评论说明原因。以上是关于通过 mod-rewrite 创建数千个 url的主要内容,如果未能解决你的问题,请参考以下文章