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

QueXuQ · 2017年10月30日 · 最后由 jesktop 回复于 2017年10月31日 · 7057 次阅读
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 了。目前应该如何改进会更好?

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 回复

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

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