请教一个 nginx 和 webman搭配使用的问题

banro512

比如 我的域名为 explame.com, nginx 里网站目录指向 public,nginx中默认文档已设为index.html

在public目录下有个 index.html

我想在直接访问 http://explame.com 时,能显示静态index.html里的内容,而不必再经由webman路由

upstream webman {
    server 127.0.0.1:8788;
}
server
{
    listen 80;
    server_name ********;
    index index.html;
    root /www/wwwroot/ybtask/public;
      location / {
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header Host $host;
          if (!-f $request_filename){
              proxy_pass http://webman;
          }
      }
}

这样配置后,直接访问域名是反代到了 webman,只有使用 http://explame.com/index.html 才能正确访问到。
同理如果public下有个ucenter目录,而该目录下有个index.html,也是只有使用 http://explame.com/ucenter/index.html 才能访问到这个index.html。如果省略了该index.html 就走到了webman。

尝试过 try_files $uri @webman; 这样配置,也是一样。

目前状态:

访问 http://explame.com/ucenter/index.html ,没有反代到webman,正常显示 index.html里内容,没问题

访问 http://explame.com/api/getmyinfo ,正常反代到了 webman,也没问题

但如果 省略掉 index.html 去访问 http://explame.com/ucenter 那么就被反代到了 webman,虽然本意只是想显示 ucenter/index.html 这个文件

目的是想在访问 http://explame.com/ucenter 这类地址时,先让nginx判断下是否存 http://explame.com/ucenter/index.html 文件,如果存在,那么就直接显示这个文件,如果不存在,再反代到webman。

1503 3 3
3个回答

oscar

网站不应该指向public目录吧
应该是只配置静态文件走public就可以了。

  • banro512 2022-04-21

    不指向public,那应该如何指向?

    指向应该没问题,现在的问题是:访问某个目录下的静态 index.html时,无法省略index.html,虽然已在nginx里将默认文档设为了index.html

    比如访问 http://explame.com/ucenter/index.html ,一切正常,没有反代到webman
    比如访问 http://explame.com/api/getmyinfo ,正常反代到 webman,也没问题

    但如果 省略掉 index.html 去访问 http://explame.com/ucenter 那么就被反代到了 webman,虽然本意是想显示 ucenter/index.html 这个文件

  • banro512 2022-04-21

    其实就是说:在访问 http://explame.com/api/getmyinfo 时,想先让nginx判断下是否存 http://explame.com/api/getmyinfo/index.html 文件,如果存在,那么直接显示这个文件,如果不存在,再反代到webman,就是这个效果

  • oscar 2022-04-21

    不应该是这样,只有public目录下的文件才能被外部访问,除此之外,所有的url都是走路由?

  • banro512 2022-04-21

    你说的没错,但你没明白我的意思,我是想访问public中某个目录下的index.html文件时,能实现省略index.html的目录。
    比如 public/abc/index.html 我是想 域名/abc 能实现和 域名/abc/index.html 一样的效果

six

nginx 配置里加一句
index index.html;
比如

server {
        listen 80;
        server_name  myadmin.com;
        root /www/wwwroot/webman/public;
        index index.html ;

        .....

}
  • banro512 2022-04-21

    已经加了的
    如果去掉反代配置,没问题,是我想要的效果,但加上那个反代到webman配置后,就必须加index.html

  • shixia 2022-04-21

    我懂你的意思 就是静态文件nginx处理 ,动态请求转发webman 对吧

  • shixia 2022-04-21

    你可以看一下这一篇文章

  • shixia 2022-04-21

    里面讲的很详细我写的

  • shixia 2022-04-21

    你设置非静态文件转发就可以了

  • banro512 2022-04-21

    不是。
    那个能设置,是要实现nginx的默认文档功能,比如nginx里默认文档 index.html。
    访问 /ucenter 时,先判断是否存在 /ucenter/index.html 这个文件,存在时就直接显示,不存在的话再反代。
    目前是访问 /ucenter 时,直接就反代到了 webman,虽然存在 /ucenter/index.html
    我知道直接 /ucenter/index.html 是可以的,只是有需求,想在url中省略 这个index.html

北月
location / {
  error_page 405 = @webman;
  try_files /${uri}/index.html /${uri} /${uri}/index.html @webman;
}
## WEBMAN LOCATION
location @webman {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:8787;
}
  • oscar 2022-04-21

    刚测试了,没问题的。只要目录里有index.html同时配置了index index.html,访问时加不加index.html都是先访问到index.html 。我是这么做的,假设静态目录的访问路径为abc.com/public/,我就只配置了
    location /public/ {
    root /yourSitePath/;
    }

  • 北月 2022-04-21

    你说的对,如果有固定前缀就很好配置了

  • banro512 2022-04-21

    按照这样配置可以了。3q

    =====

    不想在访问时有public前缀。

    其实这个就是想实现在 nginx+php-fpm时一样的效果:public下是静态文件,nginx里网站根目录指向public(访问时url不带有public)
    public下有很多目录和html文件,各个目录下也有html文件,比如 index.html, ucenter,admin,doc,css,js等,在访问时,如果指向的是这些目录(如 /ucenter , /admin ),那么就直接显示这些目录下的 index.html。

    在单纯nginx+php-fpm时,这些默认都是可以的,只是加了反代配置后,如果url没有精确匹配到 index.html 文件,就被反代了。
    一直没搞明白怎么配置。

    现在明白了,多谢 各位的回答

  • oscar 2022-04-21

    如果要那样在webman里应该是不行的,你那种想法其实就是fpm所有框架的单入口,路径逐个解析。但是在webman里默认就限制只有public目录可以被浏览器访问,虽然public也可以改名,意义不大。如果你有多个前缀,那就多配置几条规则就可以了。也不一定要是以public开头,只要root指向到webman里的public目录就可以了。比如/ucenter/=>/public/ucenter,/admin=>/public/admin,如此如此

  • banro512 2022-04-21

    明白了,3q。

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