我正在编写一个网站,其中有很多用户存储在mysql_database中,其中每个用户都有ID和profilename(如 jim.button.1 )等字段。我想要一个url(通过例如userID上的mysql_select获取配置文件)具有以下结构: www.mysite.com/jim.button.1
现在我知道我可以用mod_rewrite_rule做到这一点,但是有成千上万的用户我会得到一个非常大的.htaccess文件。顺便说一句,我不是mod重写的专家,但我理解它是如何工作的。
有没有办法做到这一点,比如在一两个mod_rewrite_rules中,还是有另一种聪明的方法来实现这个目标?
欢迎所有帮助。
答案 0 :(得分:2)
您可以使用以下方法重写未映射到现有文件的所有网址:
<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。
答案 1 :(得分:1)
您可以使用以下内容:
RewriteEngine On
RewriteRule ^(.+)$ users.php?user=$1 [QSA,L]
在您的users.php中,您可以像这样获得用户:
$user = $_GET['user'];
// do your stuff with the user
您必须对此进行微调以使其与您网站的其余部分集成,但您明白这一点。
答案 2 :(得分: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。需要在打开RewriteEngine
后开始4行,以便网站的其余部分可以继续运行(检查目录,文件,链接),如果网址是1将使用第一个规则而不再处理。然后第二个规则是,如果它不是之前的重定向,那就是到'profile.php'页面。
然后在“profile.php”页面中,您可以将您的值设为:
list($fname, $lname, $id) = explode('.', $_REQUEST['user']);
从那里开始。