我在zend framework 1.12上创建一个应用程序我有一个用户模块,它接受用户登录并从“www.example.com”注册。验证用户后,我想将用户重定向到用户特定的子域“username.example.com”。我已经配置了我的hosts文件和apache的vhost文件。
对此有任何帮助表示赞赏。
提前致谢。
答案 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());
}
}
}
以上功能背后的逻辑:
我已使用以下代码在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';
}
}
上述帮手的逻辑:
session
获取子域名,例如abc
www.example.com
,那么就可以获得example.com
。Protocol + subdomain name + domain name
。例如。 http://abc.example.com
希望它有所帮助。
答案 1 :(得分:0)
ZF1的主机名路由类型为:http://framework.zend.com/manual/1.12/en/zend.controller.router.html#zend.controller.router.routes.hostname。文档中的示例涵盖了您的确切用例。