【问题标题】:mod_rewrite complexity problemmod_rewrite 复杂性问题
【发布时间】:2009-09-29 07:24:33
【问题描述】:

我需要根据子域对我的域进行 mod 重写...在两种情况下我需要这样做:

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

  2. 我希望允许用户创建 username.example.com 以轻松将他们的个人资料传递给朋友...基本上重写为 www.example.com/user.php?id=username

随着我的网站规模扩大,我计划拥有 300 多个位置和数千名用户...这意味着手动编码每个重写规则会有点乏味。

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

【问题讨论】:

    标签: .htaccess mod-rewrite subdomain


    【解决方案1】:

    我认为从根本上说,您需要重新考虑混合命名空间的策略,因为从长远来看,这会引起很多麻烦。考虑一下如果您错过了一个城市名称,例如 alexandra.example.com,但用户已经注册了该用户名,会发生什么情况?此外,您最终将不得不做一些事情,例如在尝试创建用户名时检查一个城市是否存在。

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

    在 Apache 集中设置 DNS 通配符后:

    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>
    

    这将避免这些问题,也意味着您可以根据您输入的城市自定义用户主页上的可见内容,如果需要的话。

    【讨论】:

    • 不要将addslashes 用于 MySQL。最好使用mysql_real_escape_string
    猜你喜欢
    • 2011-06-29
    • 2018-11-30
    • 2011-08-25
    • 2021-03-24
    • 2012-05-13
    • 2017-11-28
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多