如何将子域路由到帐户页面?域名掩码如何运作?

时间:2009-05-04 21:15:40

标签: php zend-framework web-applications url-routing

第1部分

我想构建一个用户可以注册使用的PHP Zend Framework应用程序。当他们注册时,我希望应用程序创建一个指向其公共页面的子域,该子域提供特定于该客户端的内容。

例如:http://mywebapp.com/usernamehttp://username.mywebapp.com

更新: "Using sub-domains as account keys"是一个很好的教程,在这个问题上几乎回答了我的问题。这涉及使用Zend_Controller_Router_Route_Hostname

然而,我仍然在想......

问题#1:本教程未提及设置通配符子域。为了达到这个目的,这是必要的吗?有没有办法使用通配符子域?


第2部分

我还需要为用户提供注册域名并将其指向其页面的功能。因此,如果您要转到http://clientdomain.com,您会看到http://clientname.mywebapp.com,但由于地址栏中的网址显示http://client1.com,您将永远无法辨别。那有意义吗?我认为这个过程称为域掩蔽。我基本上想为我的用户提供免费的域名屏蔽。

更新:我刚刚发现了域名转销商API的世界。 OpenSRS看起来不错。你有推荐吗?

问题2:域名掩码如何运作?它可以使用域名转销商API吗?

3 个答案:

答案 0 :(得分:3)

首先,你是对的。您不希望应用程序的多个实例/安装。 设置多个Apache虚拟主机以指向Doc Root。

ServerName  www.serverOne.com
DocumentRoot "/htdocs/myapp/public"
SetEnv CONFIG_ENV "serverOne"   

ServerName www.serverTwo.com
DocumentRoot "/htdocs/myapp/public"    
SetEnv CONFIG_ENV "serverTwo"   

将所有基本网址,路径等放在Zend_Config_Xml文件的不同部分。

<?xml version="1.0" standalone="yes"?>
<config>
<siteOne>
   <base_url>http://www.siteOne.com</base_url>
       <image_path>/images/siteOne/</image_path>
       <database>
          <host>34.23.34.457</host>
          <name>siteOne_DB</name>
          <user>siteOne</user>
          <pass>**********</pass>
       </database>
    </siteOne>
    <siteTwo>
   <base_url>http://www.siteTwo.com</base_url>
       <image_path>/images/siteTwo/</image_path>
       <database>
          <host>34.23.34.456</host>
          <name>siteTwo_DB</name>
          <user>siteTwo</user>
          <pass>**********</pass>
       </database>
    </siteTwo>
</config>

然后在你的/public/index.php

<?php
require '../common/config/Bootstrap.php';
$bootstrap = new Bootstrap($_SERVER['CONFIG_ENV']);
$bootstrap->runApp();
?>

在Bootstrap.php的runApp()方法中:

function runApp($env)
{
   $root   = realpath(dirname(__FILE__) . '/..');
   $config = new Zend_Config_Xml($root . '/config.xml', $env);

这将与相对链接完美配合,并且不需要任何模式匹配:)

如果您没有Bootstrap.php文件,则可以了解如何创建&amp;在Manning Press的“Zend Framework In Action”一书中使用,可立即以PDF格式下载。它帮助我度过了一段艰难时期。

答案 1 :(得分:1)

对于您的问题的第1部分,您可以在此处实施任何解决方案 - 但我不确定您是否需要路由器 - 您不会为每个站点提供不同的功能 - 您只是想根据以下内容加载不同的内容URL。我们以一种非常简单的方式处理这个问题:

  1. 在bootstrap.php中,您需要获取服务器URL
  2. 获取网址并删除http://之前和.mywebapp.com之前的部分
  3. 在数据库表中查找此前缀,并加载有关用户所需的任何信息或其他与此前缀有关的信息
  4. 将一个对象放入Zend_Config,然后您可以从任何包含站点详细信息的页面访问(我们称之为siteinfo)。
  5. 根据siteinfo修改您的控制器或视图以做出不同的响应 - 即。改变他们检索的数据等
  6. 您需要修改apache来处理这个问题 - 最简单的方法是确保您的默认域(当无法识别URL时出现的页面)设置为您的应用程序。

    处理DNS更改并不容易 - 您需要一台可以处理通配符回复的DNS服务器。

    第2部分: 我想你是说如果我输入网址http://grouchal.com,我会将其重定向到http://grouchal.yourwebapp.com。这将要求我更新grouchal.com的现有DNS服务器条目,以便找到您的服务器。

    如果您希望在实践中看到一个很好的示例,您应该为您的域帐户设置Google应用。我输入的邮件如mail.grouchal.com一旦输入成为mail.google.com/a/grouchal.com。这要求我设置grouchal.com DNS服务器指向谷歌服务器。谷歌服务器然后放​​置一个重定向,将网址更改为他们需要的网址。

    回到我上面提出的解决方案,你会修改它,这样除了检查你的域名何时存在的前缀(即从http://grouchal.mywebapp.com剥离出来),它还会查找备用域。因此,如果地址中没有mywebapp.com,那么它将在数据库grouchal.com中查找,然后使用该数据设置siteinfo。

    希望这是有道理的 - 您将遇到的问题不是在PHP中,而是在设置您的Wildcat DNS服务器并让您的客户正确配置其DNS服务器。祝这个项目好运。

答案 2 :(得分:0)

由于Zend Framework使用MVC模式,您可以拥有单个模型和控制器,然后为每个域提供不同的视图。

拥有自定义视图后,您可以检测键入的域并显示正确的视图。例如,在您的引导程序中,您可以通过这种方式检测域:

// Bootstrap or controller
$domain = array_reverse(split('[.]', $_SERVER['SERVER_NAME']));
$domain = $domain[1] . '.' . $domain[0];

// Store domain in registry
Zend_Registry::set('domain', $domain);


// Calling the view from the controller
$domain = Zend_Registry::get('domain');
$this->render($domain . 'home');

这只是一个想法!