webman 多应用 绑定不同域名

shixia

感谢 walkor 大佬解决多域名鉴权 关于实现像TP6一样的多域名控制应用解决方案是
安装 大佬编写的多域名控制插件 地址:https://www.workerman.net/plugin/11
我对于webman的使用方式是nginx处理静态文件 webman处理动态请求 以达到更高的效率

反向代理配置文件这样写

location ^~ /
{
        if (!-e $request_filename){
           proxy_pass http://127.0.0.1:8787;
        }
         #设置域名 不加这个webman获取不到用户IP
        proxy_set_header Host $host;
        #设置用户IP 不加这个webman获取不到用户IP
        proxy_set_header X-Real-IP $remote_addr; 
        #这个我也不知道干啥的反正加上就对了
        proxy_set_header REMOTE-HOST $remote_addr; 
        #不需要关闭nginx缓存删掉下面这行
        proxy_cache                     off;
}

这样写的意思是判断是否为静态文件如果为静态文件则把反向代理到 webman 的监听地址 并关闭了nginx的反向代理缓存 (为什么要关闭反向代理缓存,因为当你的响应头中带有缓存标识时 不只是浏览器会缓存这个请求nginx也会缓存这个请求(这个时候请求就到不了webman中),当浏览器缓存了这个请求时nginx是完全没有必要去缓存的毕竟我们要的只是让他转发)

伪静态文件这样写

假设有应用 A 绑定域名 www.a.com 应用 B 绑定 www.b.com

if (-f $request_filename){
    break;
}
# 根据域名重写url
if ($host = 'www.a.com') {
    rewrite ^/(.*)$ /A/$1 last;
}
# 根据域名重写url
if ($host = 'www.b.com') {
    rewrite ^/(.*)$ /B/$1 last;
}

这样即可这样不会导致静态文件的url也被重写

然后最重要的一步 配置nginx主配置文件下面我用的宝塔 如果是自己手动装的nginx 你们大概也知道怎么替换

6041 4 21
4个回答

walkor 打赏

不用开多端口,给每个应用加一个中间件,中间件里判断域名,如果域名不对就返回404。

https://www.workerman.net/doc/webman/middleware.html
https://www.workerman.net/doc/webman/multiapp.html#%E5%A4%9A%E5%BA%94%E7%94%A8%E4%B8%AD%E9%97%B4%E4%BB%B6%E9%85%8D%E7%BD%AE

  • shixia 2022-02-21

    那样的话还是会使得url中带有应用名,这样的话感觉非常麻烦 还有其他方案吗大佬

  • walkor 2022-02-21

    url不带域名,域名可以直接通过 $request->host() 获取

  • shixia 2022-02-21

    大佬,我明白你的意思 就是域名鉴权 只有指定域名可以访问到应用 ,假设我有俩应用 admin client admin应用用中间件限制域名为www.admin.com 那我访问这个应用时我的url 依旧是 https://www.admin.com/admin/xxxx 这样去访问, 我想要的是直接域名指向应用 如上 我想要的url是 https://www.admin.com/xxxx 省略掉应用名部分

  • shixia 2022-02-21

    这种应该从入口文件就开始分辨根据应用绑定的域名来进行访问

  • shixia 2022-02-21

    但是我没找到webman 的入口文件是哪个

  • Tinywan 2022-02-22

    直接使用Nginx

  • walkor 2022-02-22

    用nginx做url重写应该是可行的方案。稍后我写个webman的域名绑定插件,到时候应该可以做到按照域名绑定应用,并且可以简写url地址。

walkor 打赏

应用域名绑定插件写好了,试下
https://www.workerman.net/plugin/11

  • ersic 2022-02-22

    👍

  • chen 2022-02-22

    大佬牛逼!

  • shixia 2022-03-02

    大佬,我来反馈BUG了

    1. 如果开启插件后如果简写URL那么俩个应用之间不能有同名控制器否则会报错;
      2.目测这个bug无法解决因为简写URL只是通过添加路由的方式做到绑定域名
      3.感觉要通过修改原生入口文件才能对这个进行修复
  • shixia 2022-03-02

    然后发现一个不知道算不算bug的bug就是
    假设
    我有俩应用第一个client 绑定的域名是 client.123.com 有控制器index
    第二个应用叫 api 绑定的域名是 api.123.com
    然后我访问 api.123.com/index 然后访问到的应用是client

  • shixia 2022-03-02

    大佬看看怎么完善一下

  • walkor 2022-03-02

    config/plugin/webman/domain/app.php里的 short_url 设置为false,然后用nginx重写url,类似这样配置

    server {
        listen 80;
        server_name abc.com admin.abc.com blog.abc.com;
        # 根据域名重写url
        if ($host = 'admin.abc.com') {
            rewrite ^/(.*)$ /admin/$1 last;
        }
        # 根据域名重写url
        if ($host = 'blog.abc.com') {
            rewrite ^/(.*)$ /blog/$1 last;
        }
        location / {
                    proxy_pass http://127.0.0.1:8787/;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header Host $http_host;
            }
    }
  • shixia 2022-03-02

    大佬那是不是还可以在nginx中配置伪静态就是用户在访问的时候自己吧.html那些给嘎了

  • shixia 2022-03-02

    然后大佬这样重写url直接把静态文件的url也重写了

  • walkor 2022-03-03

    每个域名配置个nginx

    server {
        listen 80;
        server_name admin.abc.com;
        root /your/webman/public;
    
        if (!-e $request_filename) {
              rewrite ^/(.*)$ /admin/$1 break;
        }
        location / {
                    proxy_pass http://127.0.0.1:8787/;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header Host $http_host;
            }
    }
  • shixia 2022-03-09

    老大,我的解决方案是这样的依旧是一个nginx配置 然后把伪静态规则独立出来成为一个文件然后引用 if (-f $request_filename){
    break;
    }
    //后面根据域名重写URL

  • walkor 2022-03-09

    好的,你这样更简洁些。能发个完整的example 配置分享给大家?感谢

  • shixia 2022-03-09

    发在哪里

  • walkor 2022-03-09

    就这个帖子里

  • shixia 2022-03-09

    老大弄完了,保姆级教程

  • walkor 2022-03-09

    非常感谢

  • shixia 2022-03-09

    应该的

  • shixia 2022-03-09

    对了老大,关于thinkorm 其实还有一个小bug 就是 模型,创建的模型文件默认是继承support/model 然后 support/model呢默认继承的是Illuminate\Database\Eloquent\Model as BaseModel 如果想要使用ThinkOrm模型的话得继承think\Model 然后这个问题在think插件里面也没有得到解决

  • walkor 2022-03-09

    对, support\Model 是针对laraval数据库的,thinkorm不能用它。安装thinkorm插件并不影响laraval数据库的使用。

  • shixia 2022-03-09

    但是命令行生成的模型 默认就是继承的support/model 但是如果我换成了think的那肯定一般来说都是废弃laraval数据库

  • walkor 2022-03-09

    我懂你的意思了,后面这里优化下,如果安装了thinkorm,命令生成thinkorm的model

  • shixia 2022-03-09

    恩恩

  • walkor 2022-03-10

    弄好了,composer require webman/console ^v1.0.12
    阿里云composer代理好像有点问题,如果下载不到v1.0.12的话去掉代理 composer config -g --unset repos.packagist 试下

  • shixia 2022-03-10

    okok

  • shixia 2022-03-10

    老大睡了没,问个经验性问题 我用think-cache建立一个redis对象 然后我把这个对象放在 控制器的类成员里面应该没啥问题吧,按道理应该是没问题的

  • walkor 2022-03-10

    没问题

woeoio

我是来给大佬助威的~~~

  • woeoio 2022-03-14

    感谢 十夏 大佬远程帮忙解决类型问题!

gddd
if (-f $request_filename){
    break;
}
# 根据域名重写url
if ($host = 'www.a.com') {
    rewrite ^/(.*)$ /A/$1 last;
}
# 根据域名重写url
if ($host = 'www.b.com') {
    rewrite ^/(.*)$ /B/$1 last;
}

这样后,public目录下面的静态文件就能直接下载了,比如支付 证书啥的

  • nitron 2022-04-27

    支付证书一般不会放倒public目录的吧

年代过于久远,无法发表回答
×
🔝