Nginx ****/projects 往后的所有路径匹配到一个静态文件应该如何写 loaction?

QueXuQ · 2017年10月30日 · 最后由 jesktop 回复于 2017年10月31日 · 1217 次阅读
location /projects {
  alias /home/deploy/www/projects_vue;
  index index.htm index.html;
}

因为这是一个前端写的项目,本来想着这样匹配到index就可以了,但是没想到如果访问***/projects/orders之类的域名,就会出现404,但是找了一下,没有发现相关的nginx该如何写这个location,希望/projects后面的所有域名的去到index.html中呢?多谢。

根据楼下小伙伴的提示,把配置改成:

upstream example {
  server unix:///tmp/example.sock;
}

server {
  listen 80;
  server_name www.example.io;
  root /home/deploy/example_backend/current/public;

  location / {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_redirect off;

    if (-f $request_filename/index.html) {
      rewrite (.*) $1/index.html break;
    }

    if (-f $request_filename.html) {
      rewrite (.*) $1.html break;
    }

    if (!-f $request_filename) {
      proxy_pass http://example;
      break;
    }
  }

  location /project {
    alias /home/deploy/example_frontend;
    try_files $uri $uri/ /index.html?/$request_uri;
  }
}

可是仍然是原来的问题,不同的是/project/xxxx这类域名,就跑去读取rails了,而不是404了。目前应该如何改进会更好?

共收到 14 条回复

try_files

location支持正则表达式吧

pynix 回复

好像和正则表达式还是有区别的。

guyanbiao 回复
location ^~ /projects/ {
  alias /home/deploy/www/projects_vue;
  try_files index.htm index.html;
}

试了一下这种写法,还是不行。

部署在不同的机器,开cors

pynix 回复

真的只有弄的那么复杂吗?/(ㄒoㄒ)/~~

其实nginx的流程是这样的,例如他访问/projects/orders的路径,他也会去找alias或者root文件夹下的orders文件,所以单纯从location上做正则的匹配没用,他最后找的文件依然不是index,学 @guyanbiao 说的try_files思路应该是正确的,就是不知道如何表达。

因为静态页面在/projects下,而/projects/*以外的try_files到/projects中。

QueXuQ 回复

一种方法是部署前端,代理后端API,或者干脆分开部署在不同的子域名下。。。

pynix 回复

最开始是考虑子域名的事的,但是因为SSL用在子域名上也不方便,所以就都放一起。

QueXuQ 回复

建议你把前端构建在 public目录,然后在route加个scope :api, 在nginx把 /api pass到rails。

pynix 回复

这部单纯是一个API和前端的事,我们目前首页简介,付费,注册等事情,还是交给Rails做,就是SAAS服务内才扔给前端。

QueXuQ 回复

好吧。。。。太坑了。。。。

QueXuQ 回复

泛域名 EV证书好像也就1年1w多块。。。

pynix 回复

😢 是的,研究了好久,现在还没有发现方法。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册