Zend Framework应用程序,在一个域和子域上的其他页面上具有登录和注册页面

时间:2011-02-07 13:39:04

标签: php zend-framework subdomain

我们开发了一个zend框架应用程序,并希望注册页面和登录页面在我们的域中,例如http://domain.com(现在所有页面都在http://domain.com上)和其他页面(您必须重定向)在验证之后)在子域:http://subdomain.domain.com。 你能告诉我怎么解决吗? 谢谢你的任何想法。

1 个答案:

答案 0 :(得分:1)

我在我的一个主要ZF应用程序中做过这种事情。这是一个复杂的三部分问题,但希望这会让你开始朝着正确的方向前进。

首先是会话Cookie。设置会话cookie时,您需要使用通配符域参数。在您的Bootstrap中或通常开始会话之前的某个地方,请包含以下行:

Zend_Session::start(array('cookie_domain' => '.domain.com'));

请注意“domain.com”之前的点(“。”)。这使得Cookie适用于domain.com以及其下的所有子域。

第二个是整个网站的网址。您可以使用重定向器操作助手的gotoUrl()方法。在您想要重定向用户的操作方法结束时,请使用如下所示的行:

$this->_redirector->gotoUrl('http://domain.com/somewhere/else');

当然,您可能希望通过其他方式组装URL字符串,例如将域存储在配置参数中,并使用ZF生成URL路径的本机方法之一来连接路径。有关更多信息,请参阅Zend_Controller_Action_Helper_Redirector的文档。您还需要注意网站上的所有网址,并确保每个链接都包含正确的网址。

第三是您的应用在涉及子域时解释路由的方式。有几种方法可以实现此目的,但其中一种方法是在您的应用程序中创建一个与您要使用的每个子域相对应的模块。然后使用Controller Plugin拦截ZF的正常路由机制,并根据子域适当设置模块名称。类似的东西:

class My_Controller_Plugin_RouteMySubdomains extends Zend_Controller_Plugin_Abstract {

    public function routeShutdown(Zend_Controller_Request_Abstract $request) {
        $hostname = $request->getHttpHost();
        if (strlen($hostname) > strlen('domain.com')) {
            $moduleName = preg_replace("/\.domain\.com$/", '', $hostname);
            $request->setModuleName($moduleName);
        }
    }
}

你需要告诉ZF使用这个插件。如果您使用Zend_Applicationapplication.ini文件进行基本配置,则需要添加如下所示的行:

resources.frontController.plugins.routeMySubdomains = "My_Controller_Plugin_RouteMySubdomains"
祝你好运!

相关问题