首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将子域路由到帐户页?域掩蔽是如何工作的?

问如何将子域路由到帐户页?域掩蔽是如何工作的?
EN

Stack Overflow用户
提问于 2009-05-04 21:15:39
回答 3查看 1.2K关注 0票数 3

第1部分

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

例如:http://mywebapp.com/username或http://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一起工作吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-06-20 05:56:35

对于问题的第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这样的urls,一旦输入就可以成为mail.google.com/a/grochar.com。这要求我设置grouchal.com DNS服务器来指向一个google服务器。然后,google服务器将重定向放在适当的位置,将url更改为他们需要的url。

回到我前面提出的解决方案,您将修改它,以便除了检查域名存在时的前缀(即从http://grouchal.mywebapp.com中去掉群)之外,它还将查找替代域。因此,如果地址中没有mywebapp.com,那么它将在数据库grouchal.com中查找,然后使用该数据设置siteinfo。

希望这是有意义的-问题将不是在PHP中,而是在设置您的通配式DNS服务器和让您的客户正确配置他们的DNS服务器。祝你在这个项目上好运。

票数 1
EN

Stack Overflow用户

发布于 2009-05-08 17:16:32

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

代码语言:javascript
复制
ServerName  www.serverOne.com
DocumentRoot "/htdocs/myapp/public"
SetEnv CONFIG_ENV "serverOne"   

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

将所有的基本urls、路径等放在Zend_Config_Xml文件的不同部分。

代码语言:javascript
复制
<?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中

代码语言:javascript
复制
<?php
require '../common/config/Bootstrap.php';
$bootstrap = new Bootstrap($_SERVER['CONFIG_ENV']);
$bootstrap->runApp();
?>

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

代码语言:javascript
复制
function runApp($env)
{
   $root   = realpath(dirname(__FILE__) . '/..');
   $config = new Zend_Config_Xml($root . '/config.xml', $env);

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

如果您没有Bootstrap.php文件,您可以了解如何在Manning Press的“”一书中创建和使用它,可以立即作为PDF下载获得。它帮助我度过了一些艰难的时期。

票数 3
EN

Stack Overflow用户

发布于 2009-05-05 09:38:58

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

拥有自定义视图后,可以检测类型域并显示正确的视图。例如,在您的引导程序中,您可以这样检测域:

代码语言:javascript
复制
// 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');

这是个好主意!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/822100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档