如何在Zend Framework 1.12中基于模块的应用程序中创建基于用户的虚拟子域?

时间:2014-08-21 11:49:06

标签: php zend-framework virtual subdomain

我在zend framework 1.12上创建一个应用程序我有一个用户模块,它接受用户登录并从“www.example.com”注册。验证用户后,我想将用户重定向到用户特定的子域“username.example.com”。我已经配置了我的hosts文件和apache的vhost文件。

对此有任何帮助表示赞赏。

提前致谢。

2 个答案:

答案 0 :(得分:0)

以下是我在项目中用于多个子域的方式;

index.php文件中提取子域名(如果存在的话),并将其设置为常量变量。这将在稍后使用。

function extract_domain($domain) {
    if(preg_match("/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i", $domain, $matches)) {
        return $matches['domain'];
    } else {
        return $domain;
    }
}
function extract_subdomains($domain) {
    $subdomains = $domain;
    $domain = extract_domain($subdomains);
    $subdomains = str_replace('www', '', rtrim(strstr($subdomains, $domain, true), '.'));
    return $subdomains;
}

$subDomainName = extract_subdomains($_SERVER['HTTP_HOST']);
//this const will be used in bootstrap file.
define('SUBDOMAIN_NAME', $subDomainName);

login之后,在要重定向用户的会话变量中保存子域的名称。您可以在bootstap模块的user文件中编写以下函数:

protected function _initSubdomainCheck() {
    //Get session in your own way for below line. I'm using action helper to manage the session.
    $userSession = Zend_Controller_Action_HelperBroker::getStaticHelper('siteSession')->getUserSession();
    $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
    //check if user is logged in then redirect user to a subdomain
    if(isset ( $userSession->logged_in ) && $userSession->logged_in == 1) {
        //SUBDOMAIN_NAME is a const variable i have set in index.php. If user is already redirected to the subdomain which is stored in session then no need to have further redirection
        if($userSession->urlSubDomainName != SUBDOMAIN_NAME) {
            $redirector->gotoUrl(Zend_Controller_Action_HelperBroker::getStaticHelper('common')->getAfterLoginUrl());
        }
    }
}

以上功能背后的逻辑:

  1. 获取会话变量
  2. 检查用户是否已登录
  3. 如果用户已登录,则检查用户是否已在子域URL上,如果没有,则将用户重定向到特定子域。
  4. 我已使用以下代码在common中创建了一个操作助手/application/helpers/Common.php: 可以通过以下方式调用此操作助手的方法:Zend_Controller_Action_HelperBroker::getStaticHelper('common')->methodName();

    class Zend_Controller_Action_Helper_Common extends Zend_Controller_Action_Helper_Abstract{
    
        public function getSiteUrl(){
            $baseUrl = Zend_Controller_Front::getInstance()->getRequest()->getBaseUrl();
            return $this->getServerProtocol().$_SERVER['HTTP_HOST'] . $baseUrl;
        }
    
        public function getServerProtocol() {
            $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
            return $protocol;
        }
    
        function extract_domain($domain) {
            if(preg_match("/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i", $domain, $matches)) {
               return $matches['domain'];
             } else {
               return $domain;
             }
         }
    
        public function getSubdomainName() {
            //get session object in your way.
            $session = Zend_Controller_Action_HelperBroker::getStaticHelper('siteSession')->getUserSession();
            $domainName = extract_domain($this->getSiteUrl());
            return $this->getServerProtocol()
                .$session->urlSubDomainName.'.'
                .$domainName;
        }
        public function getAfterLoginUrl(){
            return $this->getSubdomainName().'/yourController/Youraction';
        }
    
    }
    

    上述帮手的逻辑:

    1. 我们编写了这个助手来获取子域名url。首先,我们从session获取子域名,例如abc
    2. 之后提取域名。对于例如如果你有www.example.com,那么就可以获得example.com
    3. 最后创建子域名网址Protocol + subdomain name + domain name。例如。 http://abc.example.com
    4. 返回此网址。
    5. 希望它有所帮助。

答案 1 :(得分:0)

ZF1的主机名路由类型为:http://framework.zend.com/manual/1.12/en/zend.controller.router.html#zend.controller.router.routes.hostname。文档中的示例涵盖了您的确切用例。