多站点使用入口文件的方式控制,要添加一个站点,直接在public目录里面添加一个入口文件即可。
## 添加多站点(以index+admin站点为例)
### 1. 子域名方式
- apache服务器
1. 站点配置。在apache的httpd-vhost中加入两个站点的配置:
```
# 默认站点配置
DirectoryIndex index.php
DocumentRoot "/directory/to/your-project/public"
ServerName 您的域名
# admin子站点配置
DirectoryIndex admin.php
DocumentRoot "/directory/to/your-project/public"
ServerName 您的admin子域名
```
2. 重写规则配置(站点public目录下的.htaccess文件)
1. 修改默认重写规则,添加域名限制。
```
# 在上面添加一行域名限制
RewriteCond %{HTTP_HOST} ^您的域名$ [NC]
# 一下为原本的配置信息
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
```
2. 目录中加入重写规则:
```
RewriteCond %{HTTP_HOST} ^您的admin子域名$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ admin.php/$1 [QSA,PT,L]
```
完整的.htaccess文件内容:
```
Options +FollowSymlinks -Multiviews
RewriteEngine On
# 默认站点重写规则
RewriteCond %{HTTP_HOST} ^您的域名$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
# admin子站点重写规则
RewriteCond %{HTTP_HOST} ^您的admin子域名$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ admin.php/$1 [QSA,PT,L]
```
- nginx服务器
在nginx服务器中,同样添加一个admin子域名的站点,默认访问文件改为admin.php即可,完整的nginx配置文件如下:
```
# 默认站点配置
server {
listen 80;
server_name 您的域名;
root /directory/to/your-project/public;
location / {
index index.html index.htm index.php;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
break;
}
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# admin子站点配置
server {
listen 80;
server_name 您的admin子域名;
root /directory/to/your-project/public;
location / {
index admin.php;
if (!-e $request_filename) {
rewrite ^(.*)$ /admin.php?s=/$1 last;
break;
}
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
```
> 以上配置信息中,您需要将目录名及域名改为您的目录及域名。
> 如果需要配置https等信息,请自行添加https证书配置即可。
## 2.
多站点实现的两种方式:
1. 使用子域名。
优点:
1. 不会污染url,不需要再url中加入入口文件名。
2. 缺点:需要在服务器(apache、nginx)中配置相关域名并指向到对应入口文件。无法做到开箱即用。
3. apache必须开启rewrite模块。一般在使用thinkphp框架时,已经开启了重写模块,所以这个限制问题不大。
3. 考虑apache中是否可以通过htaccess文件配置,解决服务器自动配置的问题。
2. url中加入对应入口文件路径。
1. 优点:可以做到开箱即用。不需要修改服务器配置。
2. 缺点:会污染url。前端处理麻烦,需要统一配置url前缀,并在前端ajax请求及对应url跳转时加入前缀。需要修改的地方太多。
3. 前端需要解决默认站点不带前缀与其他站点带前缀的问题。(根据访问url与pathinfo,自动处理前缀,并将前缀发送到前端)
---
考虑怎么将两种用法综合,用户可以开箱即用,及在url中加入对应入口文件,并可通过默认入口文件放人默认站点。也可通过配置子域名,去除url污染。
> 首选实现1,然后再1的基础上实现2。