2009-09-28 44 views
0

我有一个需要MOD-重写我的基于域的子域关闭的......有两个场景中,我需要做的是:mod_rewrite的复杂问题

  1. 我的网站位于不同的城市...所以losangeles.example.com应该本地化为洛杉矶等...基本上重写为www.example.com/?loc=losangeles

  2. 我想允许用户创建username.example.com到轻松传递他们的档案给朋友...基本上重写为www.example.com/user.php?id=username

由于我的网站规模庞大,我计划拥有超过300个位置和数千个用户......这意味着编写每个重写规则的手会有点乏味。

我该如何告诉mod-rewrite在位置子域和用户名子域之间进行解密?

回答

2

我认为从根本上说,您需要重新思考该策略,因为混合您的名称空间将会在长期内引发许多令人头疼的问题。考虑如果您错过了城市名称(如alexandra.example.com),但用户注册了该用户名,会发生什么情况?另外,你将不得不做一些事情,例如在用户名尝试创建的时候检查一个城市是否存在。

如果你真的想坚持这一点,一种可能性就是将请求发送到一个点,然后对两个数据库进行查找,然后在内部设置$ city或$ user的变量。

一旦你已经设置了DNS通配符,在Apache的设置:

ServerAlias *.example.com 

,然后你的虚拟主机的其余正常。

然后在应用程序中检查$ _SERVER ['SERVER_NAME'],例如

$server_name = addslashes($_SERVER['SERVER_NAME']);  
$query = "select * from instances where '{$server_name}' regexp replace(concat(server, '$'),'.','\.') limit 1"; 

但是你实际上将不得不有两个查询和额外的逻辑来拉开两个命名空间或处理冲突情况。

我会使用一个命名空间像

<cityname>.example.com/user/<username> 

这将避免的问题,同时也意味着你可以自定义什么是对用户的网页取决于你输入哪个城市,如果希望看到。

+1

不要对MySQL使用'addslashes'。更好地使用'mysql_real_escape_string'。 – Gumbo 2009-09-29 04:47:42