webman本身不处理ssl证书或sni,https必须由nginx/apache终止并转发明文请求;多域名需为每个域名配置独立的server { listen 443 ssl http2; server_name 域名; ssl_certificate 绝对路径; }块,且证书cn/san须严格匹配域名。

config/route.php 或装插件就能解决。
Webman 多域名 HTTPS 的本质是 Web 服务器 SNI 配置
很多人误以为装了 webman-multi-domain 插件就能自动管证书——它只做路由分发和域名鉴权,不碰 TLS 握手。证书加载、SNI 协商、私钥读取全在 Nginx/Apache 进程里完成。Webman 收到的请求已经是明文,$request->host() 拿到的是 Host 请求头,不是证书信息。
所以你遇到“访问 site-b.com 显示 site-a.com 的证书”或“浏览器报 NET::ERR_CERT_COMMON_NAME_INVALID”,问题一定出在 Nginx 的 server 块没写对,而不是 Webman 路由没配好。
- Webman 启动后只监听一个端口(如
0.0.0.0:8787),它不绑定域名也不加载证书 - 所有 HTTPS 流量必须先经 Nginx 终止 SSL,再以 HTTP 协议转发给 Webman
- 每个域名必须有独立的
server { listen 443 ssl http2; ... }块,且server_name和ssl_certificate必须严格匹配 - 不能把多个
server_name塞进同一个server块里指望它自动选证书——Nginx 不会这么做
Nginx 配置多域名 SSL 的硬性要求
在 phpEnv 或宝塔中用 Nginx 托管 Webman 多域名 HTTPS,以下四点漏掉任一都会失败:
-
listen 443 ssl http2;必须带ssl关键字,只写listen 443;会被当 HTTP 处理 -
ssl_certificate和ssl_certificate_key必须是绝对路径,Windows 下推荐用正斜杠,例如:C:/phpEnv/nginx/ssl/site-a.com/fullchain.pem - 证书文件名不能含空格、中文或特殊字符;私钥文件需确保未被 Windows 标记为“来自其他计算机”(右键 → 属性 → 解除锁定)
- 每个
server块的server_name必须与证书的 Subject CN 或 SAN 完全一致;www.site-a.com的证书不能用于site-a.com,除非 SAN 明确包含两者
常见错误配置:ssl_certificate /etc/nginx/ssl/default.crt; —— 全局路径,所有域名共用一张证书,必然错配。
Webman 如何感知当前域名并路由到对应应用
Webman 接收的是 Nginx 转发来的请求,它靠 $request->host() 或 $_SERVER['HTTP_HOST'] 判断来源域名,再结合中间件或路由分组做分发。比如:
// app/middleware/DomainRouter.php
public function process($request, \Closure $next)
{
$host = $request->host();
if ($host === 'admin.example.com') {
// 强制前缀路由
\support\Route::group(['prefix' => 'admin'], function () {
require_once app_path() . '/admin/route.php';
});
} elseif ($host === 'api.example.com') {
\support\Route::group(['prefix' => 'api'], function () {
require_once app_path() . '/api/route.php';
});
}
return $next($request);
}
注意:
• 不要依赖 URL 路径含应用名(如 /admin/xxx)来区分,那是退化方案
• route.php 中不要写死 get('/xxx', ...),要用 group(['domain' => 'xxx.com'])(Webman 1.5+ 支持)
• 若用旧版 Webman,必须在中间件里动态 require 对应应用的路由文件,且确保无重复加载
phpEnv 下 Apache 用户的特别注意事项
phpEnv 默认用 Apache,但它的 Apache 配置比 Nginx 更容易踩坑:
- 必须确认
httpd.conf中LoadModule ssl_module modules/mod_ssl.so未被注释 - 每个域名必须用独立
<virtualhost></virtualhost>块,不能靠ServerAlias混用证书 -
SSLCertificateFile必须指向纯证书(不含私钥),SSLCertificateKeyFile单独指私钥;Let’s Encrypt 的fullchain.pem已含链,此时不用SSLCertificateChainFile - Windows 下 Apache 启动失败常因
libcrypto-1_1-x64.dll缺失,检查phpEnv/Apache/bin/目录是否存在该文件
验证是否生效:用命令 openssl s_client -connect site-a.test:443 -servername site-a.test 看返回的证书 Subject 是否匹配;若返回的是默认证书,说明 SNI 没触发,大概率是 ServerName 写错了或 hosts 未映射。
X-Forwarded-Host 或 Host 头——而这个头可以被伪造。生产环境务必配合 proxy_set_header Host $host; 和严格的中间件校验,别让 curl -H "Host: fake.com" https://real.com 绕过域名白名单。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











