3

第1部分

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

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

更新: “使用子域作为帐户密钥”是一个很好的教程,它几乎回答了我在这个问题上的问题。这涉及使用Zend_Controller_Router_Route_Hostname.

但是,我仍然想知道...

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


第2部分

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

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

问题 #2:域屏蔽如何工作?它可以与域经销商 API 一起使用吗?

4

3 回答 3

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"   

将所有基本 url、路径等放在 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 文件,您可以在 Manning Press 的“Zend Framework In Action”一书中了解如何创建和使用,该书可立即作为 PDF 下载。它帮助我度过了一些艰难的时期。

于 2009-05-08T17:16:32.737 回答
1

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

  1. 在您的 bootstrap.php 中,您需要获取服务器 URL
  2. 获取 URL 并去掉 http:// 之后和 .mywebapp.com 之前的部分
  3. 在数据库表中查找此前缀并加载您需要的有关用户的任何信息或与此前缀有关的其他信息
  4. 将一个对象放入 Zend_Config 中,然后您可以从任何带有站点详细信息的页面访问该对象(我们称之为 siteinfo)。
  5. 修改您的控制器或视图以根据站点信息做出不同的响应 - 即。更改他们检索的数据等

您将需要修改 apache 来处理这个问题 - 最简单的方法是确保您的默认域(无法识别 URL 时出现的页面)设置为您的应用程序。

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

第 2 部分: 我认为您是在说,如果我输入 URL http://grouchal.com这将重定向到http://grouchal.yourwebapp.com。这将需要我更新 grouchal.com 的现有 DNS 服务器条目,以便找到您的服务器。

如果你想在实践中看到一个很好的例子,你应该为你的域帐户设置一个谷歌应用程序。我有像 mail.grouchal.com 这样的网址,一旦输入就变成了 mail.google.com/a/grouchal.com。这需要我将 grouchal.com DNS 服务器设置为指向 google 服务器。然后,谷歌服务器会设置一个重定向以将 URL 更改为他们需要的 URL。

回到我上面提出的解决方案,您将对其进行修改,以便除了检查您的域名何时存在的前缀(即从http://grouchal.mywebapp.com中删除 grouchal )之外,它还将查找备用域. 因此,如果地址中没有 mywebapp.com,那么它将在数据库 grouchal.com 中查找,然后使用该数据设置站点信息。

希望这是有道理的 - 您将遇到的问题不会出现在 PHP 中,而是在设置通配符 DNS 服务器和让您的客户正确配置他们的 DNS 服务器时。祝你项目好运。

于 2009-06-20T05:56:35.240 回答
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');

这只是和想法!

于 2009-05-05T09:38:58.627 回答