【问题标题】:Nginx configuration for single page app and nested directories单页应用程序和嵌套目录的 Nginx 配置
【发布时间】:2017-09-17 08:11:41
【问题描述】:

我有一个目录/文件结构,例如:

root/
  a/
    utils.js
  b/
    assets/
      styles.css
      app.js
    index.html

并且我想将 nginx 配置为直接从 a 目录提供文件(如果存在),并且在目录 b 中有单页应用程序(如果路径中的文件存在,它将直接提供,如果不存在,则回退将结束在index.htm 文件上。

例如:

  • myapp.com/a/utils.js 将返回该文件。
  • myapp.com/b/myapp.com/b/foo 将显示 index.html
  • myapp.com/b/assets/style.css会直接返回css文件

我尝试了多种不同的配置,但到目前为止都没有。例如最简单的:

server {
    listen 80;

    root /root;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html =404;
    }
}

我也尝试为不同的目录提供服务:

server {
    listen 80;

    root /root;
    index index.html;

    location /a {
        try_files $uri $uri/ =404;
    }

    location /b {
        try_files $uri $uri/ /index.html =404;
    }
}

我也尝试定义不同的根:

server {
    listen 80;

    index index.html;

    location /a {
        root /root/a;
        try_files $uri $uri/ =404;
    }

    location /b {
        root /root/b;
        try_files $uri $uri/ /index.html =404;
    }
}

Nginx 似乎忽略了现有文件并最终返回 404 页面。当我尝试直接访问 soe 现有文件时,无论如何它都会被重定向到 / (root) url。

【问题讨论】:

    标签: nginx


    【解决方案1】:

    try_files 语句的最后一个参数是默认操作。只能有一个。您的许多示例都有两个。详情请见this document

    index.html 文件的正确 URI 是 /b/index.html,这是 try_files 语句的默认操作需要使用的。

    这应该符合您的要求:

    location / {
        try_files $uri $uri/ /b/index.html;
    }
    

    您没有说明 URI /a/foo 会发生什么。在上述情况下,它也会返回index.html。如果您需要它返回 404 响应,您可以使用:

    location / {
        try_files $uri $uri/ =404;
    }
    location /b {
        try_files $uri $uri/ /b/index.html;
    }
    

    请参阅this document 了解更多信息。

    【讨论】:

    • 谢谢,但这不起作用。我使用了上面的,nginx 仍然没有显示任何存在的东西,现在它在点击任何 url 时进入无限重定向循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 2018-06-18
    • 2023-03-12
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    相关资源
    最近更新 更多