上一篇
Resin4中配置泛域名虚拟主机,可通过
^([^/]).yourdomain.com正则表达式匹配所有子域名,将其请求转发至指定root目录
前置条件
- 已安装Resin 4:确保服务器上已正确安装并运行Resin 4应用服务器。
- 域名解析设置完成:所有需绑定的泛域名(如
.example.com)均已指向当前服务器IP地址。 - 管理员权限:操作者需具备修改配置文件及重启服务的权限。
配置步骤详解
创建虚拟主机模板文件
在Resin的conf目录下新建一个XML格式的虚拟主机定义文件(例如wildcard_host.xml如下:
<host>
<!-匹配规则:任意子域名+主域名 -->
<hostname>.example.com</hostname>
<!-根路径映射到项目目录 -->
<path>/opt/resin/webapps/root</path>
<!-可选:自定义文档索引页 -->
<welcome-file>index.html</welcome-file>
<welcome-file>index.php</welcome-file>
<!-HTTPS支持(若需要) -->
<ssl-enable>true</ssl-enable>
<ssl-certificate>/path/to/cert.pem</ssl-certificate>
<ssl-private-key>/path/to/key.pem</ssl-private-key>
</host>
️ 注意:将
example.com替换为你的实际主域名,路径需存在且可读写。
关联应用上下文
若使用Java Web应用,还需在resin.xml主配置文件中注册上下文环境:
<cluster id="app-cluster">
<application>
<classpath>...</classpath>
<webapp>/opt/resin/webapps/root</webapp>
</application>
</cluster>
并通过<alias>标签实现多站点共享同一应用实例:
<alias alias=".example.com" target="app-cluster"/>
动态获取客户端请求的主机名
在代码中通过以下方式读取原始请求头中的Host字段:
| 语言 | 实现示例 | 说明 |
|————|———————————–|————————–|
| Java | request.getHeader("Host") | 直接获取完整主机名 |
| PHP | $_SERVER['HTTP_HOST'] | 包含端口号时需额外处理 |
| Python | request.headers['Host'] | Flask/Django框架通用 |
示例逻辑(Java):
String requestedHost = request.getHeader("Host"); // 输出类似 "subdomain.example.com"
// 根据subdomain参数进行业务路由分发
验证与测试
- 本地测试:修改本机hosts文件添加测试条目(如
test1.example.com → 127.0.0.1),访问确认是否正常解析。 - 生产环境测试:使用不同子域名(如
api.example.com,static.example.com)发起请求,检查日志是否记录正确的主机名。
关键注意事项对比表
| 场景 | 推荐做法 | 风险规避建议 |
|---|---|---|
| 跨域资源共享(CORS) | 在响应头中设置Access-Control-Allow-Origin |
避免星号()滥用导致安全破绽 |
| 会话保持 | 基于Cookie或URL重写实现粘性会话 | 禁用默认的JPID会话ID生成方式 |
| 负载均衡 | 结合Nginx反向代理做健康检查 | Resin自身不支持主动故障转移 |
| SSL证书管理 | 使用Let’s Encrypt自动续签工具 | 定期检查证书过期时间 |
常见问题与解答
Q1: 为什么配置生效后仍无法访问某些子域名?
A: 可能原因包括:
- DNS未完全同步:执行
dig NS example.com +short查看权威DNS服务器是否更新; - Resin缓存未刷新:执行
kill -HUP <resin进程PID>触发配置热重载; - 防火墙拦截:检查iptables规则是否放行80/443端口;
- SELinux限制:查看审计日志
ausearch -m avc确认是否有拒绝动作。
Q2: 如何实现不同子域名指向不同的物理路径?
A: 可通过两种方式实现:
- 多Host配置法:为每个子域名单独创建
<host>节点,指定不同的<path>值;
示例片段:<host><hostname>blog.example.com</hostname><path>/var/www/blog</path></host> <host><hostname>shop.example.com</hostname><path>/var/www/shop</path></host>
- 程序内路由分发:统一入口应用根据
Host头动态加载对应模块,适合微服务架构,例如Node.js Express框架可实现:const host = req.get('host'); if (host === 'admin.example.com') { require('./adminRouter')(app); }
