Express js 应用程序与 nginx - 提供子文件夹时与静态文件发生冲突

2024-01-10

upstream app {
    server localhost:3000;
}

server {
    ...
    # If I comment this location out, images are displayed on the website
    location ~* \.(?:jpg|jpeg|png|gif|swf|xml|txt|css|js)$ {

        expires 6004800;
        add_header Pragma public;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    }
    ...
    location /app {
        alias /path/to/app/public/; 
        try_files $uri $uri @app;
    }

    location @app {
        rewrite /app(.*) $1 break;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $proxy_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://app;
        proxy_redirect http://app/ /app/;
    }
    ...
}

我为此苦苦挣扎了一段时间。我在 nginx 下的子文件夹中有一个 Express 应用程序。上面是 /sites-available/ 中我的 nginx 文件中的代码。当我删除静态文件的位置时,应用程序的图像和 css 会被代理,但如果静态文件缓存位于 nginx 文件中,则 Express 应用程序的图像和 css 文件不会显示在网站上。

有人可以帮忙吗?


在 nginx 请求处理中,正则表达式位置优先于前缀位置块。以下是nginx的相关摘录位置指令文档 http://nginx.org/en/docs/http/ngx_http_core_module.html#location.

我强烈建议您仔细阅读它们,因为很多人都没有这样做并且错过了基础知识。

先看几个例子来理解关键词:

  • 前缀位置:location /toto { [...] }
  • 正则表达式位置:location ~ /toto { [...] }

[ ... ]

为了找到与给定请求匹配的位置,nginx 首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照正则表达式在配置文件中出现的顺序进行检查。正则表达式的搜索在第一个匹配处终止,并使用相应的配置。如果没有找到与正则表达式的匹配,则使用之前记住的前缀位置的配置。

[ ... ]

如果最长匹配前缀位置具有“^~”修饰符,则不检查正则表达式。

[ ... ]

此外,使用“=”修饰符可以定义 URI 和位置的精确匹配。如果找到完全匹配,则搜索终止。 [...]

其他几个例子来说明修改位置查找顺序的两个运算符:

  • location ^~ /toto { [...] }:优先级高于正则表达式位置的前缀位置
  • location = /toto { [...] }:精确前缀位置(精确匹配,最高优先级)

综上所述,传入请求 URI 的位置选择期间的优先级列表为:

  1. location = /too
  2. location ^~ /toto
  3. location ~ /toto
  4. location /toto

因此,解决问题的更干净的方法是使用:

location ^~ /app {
    alias /path/to/app/public/; 
    try_files $uri $uri @app;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Express js 应用程序与 nginx - 提供子文件夹时与静态文件发生冲突 的相关文章

随机推荐

  • Nodejs 可以与 Cakephp 集成吗?

    我想实时监控用户输入的数据comments桌子 我有一个 Apache 服务器正在运行 并且假设它在端口 1337 上有一个节点服务器 每次有人保存新数据时 我该怎么做 例如返回表中的总行数comment并显示在view 也许方法是使 th
  • 自动展开PropertyGrid中的一些属性

    我想通过使用该类的属性来自动展开加载了我的 SettingsStructure 类的实例的 PropertyGrid 中的一些节点 另外 如果用户在 PropertyGrid 上再次加载该实例 我试图让实例 记住 每个属性是否已展开 我做了
  • 在SQL中显示表的结构

    有人可以向我更好地解释一下吗 如何显示表的结构 我运行select from table 当然它会显示表中的所有内容 但是 我被要求显示表的结构 这是什么意思 命令是什么 这是我的下表 SQL gt select from dept DEP
  • 我应该在 Python 中使用“公共”属性还是“公共”属性?

    在 Python 中 我有以下示例类 class Foo self attr 0 property def attr self return self attr attr setter def attr self value self at
  • 从 data.table 聚合返回多列[重复]

    这个问题在这里已经有答案了 我想用data table作为替代aggregate or ddply 因为这两种方法没有像希望的那样有效地扩展到大型对象 不幸的是 我还没有弄清楚如何让向量返回聚合函数在结果中生成多列data table 例如
  • Bootstrap 3:嵌套选项卡

    我试图将一个选项卡放在一个选项卡内 但是每当我单击内部嵌套选项卡时 整个内部嵌套选项卡行就会消失 这是 jsfiddle 中的示例 http jsfiddle net jNWMY 1 http jsfiddle net jNWMY 1 尝试
  • 创建原始数据包来欺骗 UDP 数据包

    我正在寻找使用 Java 欺骗 UDP 数据包 有没有好的 Java 库可以让您创建自己的原始套接字 我会使用一个 Java API 来包装libpcap http www tcpdump org libpcap 有一个 注入 功能 允许您
  • 如何不在nginx访问日志中记录get请求参数?

    我需要启用访问日志 但出于合规性原因 无法在访问日志中记录敏感 GET 请求参数的数据 虽然我知道 我可以解析日志 事后 并清理它们 但这不是一个可接受的解决方案 因为出于合规性原因 日志不能被篡改 如何防止 sensitive data
  • 正则表达式匹配除某些之外的所有集合

    我确定以前曾问过这个问题 但我似乎找不到它 或知道要搜索的正确措辞 基本上我想要一个匹配除连字符之外的所有非字母数字的正则表达式 所以基本上匹配 W 除了排除 我不知道如何从预制集中排除特定的 W是一个简写 w So w 一些背景知识 定义
  • 识别批处理文件的运行实例

    这些对我不起作用 有什么帮助可以明确纠正以下四个示例吗 即使我打开了三个 CMD exe EXAMPLE01 也只是回显 继续 示例 01 echo off wmic process where name cmd exe find cmd
  • 依赖于自身的 Spark 窗口函数

    假设我在 DataFrame 中有一列已排序的时间戳 我想编写一个函数 向该 DataFrame 添加一列 根据以下规则将时间戳切割成连续的时间片 从第一行开始并继续迭代到最后 对于每一行 如果您在当前组中走了 n 行 或者您在当前组中走了
  • 获取从星期日开始的周数

    我目前有这样的代码 我可以通过添加和减去按钮获取周数以及该周的开始 结束日 Date prototype getWeekNumber function var d new Date Date UTC this getFullYear thi
  • Razor:条件语句中的 标记引发错误

    if Model Property null
  • Jenkins“仅在构建成功时才运行”对于不成功的构建仍然运行

    我正在使用 Jenkins 进行持续集成 并且我有一些具有上游和下游构建连接的项目 我已选择Run only if build succeeds在每个项目的配置中 然而 构建后步骤仍然会因不稳定的构建而被触发 詹金斯版本是 1 480 3
  • 使用循环数组实现队列:调整循环数组大小的最佳方法是什么?

    我正在实施一个使用循环数组进行队列 我有点陷入困境resize 方法实现 当数组已满时 在 的里面enqueue 方法我检查数组的大小是否等于它的长度 并获取它是否已满 现在 我不再抛出异常 而是尝试调整数组的大小 问题是 我有两种情况要考
  • postgresql 中 array_agg 的子选择

    有没有办法在 Postgresql 9 2 的having子句中使用聚合函数的值 例如 我想得到每个monkey id第二高的number gt 123 也是第二高的数字 在下面的示例中 我想获取 monkey id 1 number 22
  • 使用 AddDistributedRedisCache 时设置 IDistributedCache.SetAsync 的过期时间

    我正在使用 net core api 2 1 和 aws redis 缓存 我没有找到设置过期时间的方法IDistributedCache SetAsync https learn microsoft com en us dotnet ap
  • 在 iOS 中使用相机检测物体并使用 ARKit 定位 3D 物体

    我在寻找什么 我的要求的简单解释是这样的 使用 ARKit 使用 iPhone 相机检测对象 找到这个物体在这个虚拟空间上的位置 使用 SceneKit 将 3D 对象放置在该虚拟空间上 3D 对象应该位于 标记 一个示例是使用相机检测 3
  • 方向改变时出现的键盘问题

    在我的应用程序中 我使用各种编辑文本和文本视图以及列表视图 现在我的问题是我的键盘在方向改变时再次出现 理想情况下 当用户最小化键盘时 设备倾斜时键盘应处于最小化状态 但它又出现了 我们如何处理这种情况 我的另一个问题是我的编辑文本之一是屏
  • Express js 应用程序与 nginx - 提供子文件夹时与静态文件发生冲突

    upstream app server localhost 3000 server If I comment this location out images are displayed on the website location jp