使用Zend Framework 2进行开发,有时我们想要将不同的域名指向不同的模块。比如:
- 访问www.fynas.com指向到网站主功能Application模块;
- 访问blog.fynas.com指向到网站博客功能Blog模块。
要实现这种需求,其实有多种办法,这里介绍两种供参考,这两种方法都先要求两个域名均指向一个ip上的同一个web server,请在域名提供商处设置好。
第一种方案:web server虚拟主机配置不同域名指向不同目录
这种情况下典型的zend framework目录结构如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
config
/
autoload
/
application
.
config
.
php
blog
.
config
.
php
module
/
Application
/
config
/
module
.
config
.
php
Blog
/
config
/
module
.
config
.
php
public
/
js
/
img
/
css
/
index
.
php
.
htaccess
blog
/
js
/
img
/
css
/
index
.
php
.
htaccess
|
首先我们可以看到public(因为zend framework官方工具生成的入口文件夹就叫public,所以我们此处与之保持一致便于理解)和blog两个平行的目录,且目录下的内容结构也差不多,都包含一个入口文件index.php和几个静态资源文件夹。来看一下两个目录下的index.php的区别,以下是默认的public/index.php的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
/**
* This makes our life easier when dealing with paths. Everything is relative
* to the application root now.
*/
chdir
(
dirname
(
__DIR__
)
)
;
// Decline static file requests back to the PHP built-in webserver
if
(
php_sapi_name
(
)
===
'cli-server'
&&
is_file
(
__DIR__
.
parse_url
(
$_SERVER
[
'REQUEST_URI'
]
,
PHP_URL_PATH
)
)
)
{
return
false
;
}
// Setup autoloading
require
'init_autoloader.php'
;
// Run the application!
Zend
\
Mvc
\
Application::
init
(
require
'config/application.config.php'
)
->
run
(
)
;
|
而blog/index.php的代码与上面只需要改一下最后一句,变成:
1
|
Zend
\
Mvc
\
Application::
init
(
require
'config/blog.config.php'
)
->
run
(
)
;
|
看到这里,我们也注意到config目录下有两个配置文件——application.config.php和blog.config.php,没错,这正是上面两个不同的index.php分别加载的配置文件。下面两段代码分别是application.config.php和blog.config.php的module配置代码:
1
2
3
4
5
6
7
|
<?php
return
array
(
// This should be an array of module namespaces used in the application.
'modules'
=
>
array
(
'Application'
,
)
,
)
;
|
1
2
3
4
5
6
7
|
<?php
return
array
(
// This should be an array of module namespaces used in the application.
'modules'
=
>
array
(
'Blog'
,
)
,
)
;
|
可以看到两个的module配置加载了不同的模块。
接下来配置不同的域名指向不同的目录,以apache为例,在vhosts.conf文件中配置如下:
1
2
3
4
5
6
7
8
9
10
11
|
<
VirtualHost
*:80
>
DocumentRoot
"/xxxx/public"
ServerName
www
.
fynas
.
com
ServerAlias
www
.
fynas
.
com
<
/VirtualHost
>
<
VirtualHost
*:80
>
DocumentRoot
"/xxxx/blog"
ServerName
blog
.
fynas
.
com
ServerAlias
blog
.
fynas
.
com
<
/VirtualHost
>
|
最后不要忘了在public和blog目录下都放置一个.htaccess文件,两边内容一样,使用zend framework官方示例的即可:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
RewriteEngine
On
# 文件或目录存在,则不重写
RewriteCond
%{REQUEST_FILENAME}
-s
[OR]
RewriteCond
%{REQUEST_FILENAME}
-l
[OR]
RewriteCond
%{REQUEST_FILENAME}
-d
RewriteRule
^
.
*
$
-
[NC,L]
# 没有命中以上条件,全部重写到index.php
RewriteRule
^
.
*
$
index
.
php
[NC,L]
# [NC] 表示no case,不区分大小写
# [L] 最后一个规则,执行此规则后将不再往后执行
|
到此为止,就可以实现刚开始提出的需求了。
第二种方案:.htaccess将不同域名请求转发到不同入口文件
这种方案与上种方案有很多地方是类似的,这里介绍不同的地方。老规矩,先上目录结构:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
config
/
autoload
/
application
.
config
.
php
blog
.
config
.
php
module
/
Application
/
config
/
module
.
config
.
php
Blog
/
config
/
module
.
config
.
php
public
/
js
/
img
/
css
/
index
.
php
blog
.
php
.
htaccess
|
从目录结构上来看,简单了一些,没有前一种方案中与public平级的blog目录了,取而代之的是在public目录下新建了一个入口文件blog.php,而blog.php的代码与方案一中blog/index.php的代码一样,这里不再重复。
webserver的配置也简单一些,所有域名请求都指向到public目录:
1
2
3
4
5
|
<
VirtualHost
*:80
>
DocumentRoot
"/xxxx/public"
ServerName
fynas
.
com
ServerAlias
*
.
fynas
.
com
<
/VirtualHost
>
|
要.htaccess文件配置相对就复杂一些,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
RewriteEngine
On
# 文件或目录存在,则不重写
RewriteCond
%
{
REQUEST_FILENAME
}
-
s
[
OR
]
RewriteCond
%
{
REQUEST_FILENAME
}
-
l
[
OR
]
RewriteCond
%
{
REQUEST_FILENAME
}
-
d
RewriteRule
^
.
*
$
-
[
NC
,
L
]
# 命中blog.fynas.com域名则重写到admin.php
RewriteCond
%
{
HTTP_HOST
}
^
blog
\
.
fynas
\
.
com
$
[
NC
]
RewriteRule
^
.
*
$
blog
.
php
[
NC
,
L
]
# 没有命中以上条件,全部重写到index.php
RewriteRule
^
.
*
$
index
.
php
[
NC
,
L
]
|
好了,至此两种方法都介绍完了,当然这两种方法也不局限于不同域名配置不同模块,不同路径配置不同模块也可以参考。通过module.config.php中配置路由的方式来将不同路径指向不同的模块可能会存在view_manager相互覆盖导致多个模块无法使用多个布局的问题,详细可见《Zend Framework 2 module.config.php配置详解》。