如何使用自定义位置或路径而不是使用 nginx 的多个应用程序的根?

Posted

技术标签:

【中文标题】如何使用自定义位置或路径而不是使用 nginx 的多个应用程序的根?【英文标题】:How to use custom location or path instead root for several apps using nginx? 【发布时间】:2017-04-20 12:38:26 【问题描述】:

问题

我有一个可以在 mydomain.com 这样的根域上正常运行的网络,无需任何修改。但如果我想将其作为mydomain.com/app1 提供服务,我需要修改后端的源代码和 html 中的静态链接(css、图像等)

节点: 从app.get('/')app.get('/app1') html 从src="main.css"src="app1/main.css"

问题

当我想使用 nginx 分配一个域/路径时,我是否应该始终修改应用程序?

示例应用

https://github.com/jrichardsz/nodejs-static-pages/blob/master/server.js

app.get('/', function(req, res) 
    // ejs render automatically looks in the views folder
    res.render('index');
);

Nginx 用于根域

这是我的 nginx 配置,适用于 mydomain.com

server 
  listen 80;
  server_name mydomain.com;
 
  location / 
    proxy_pass http://localhost:8080/;
  

尝试 mydomain.com/app1

server 
  listen 80;
  server_name mydomain.com;
  
  location /app1/  
    proxy_pass http://localhost:8080/app1/; 
  

这是 node js 应用程序中的修复

app.get('/app1', function(req, res) 
    // ejs render automatically looks in the views folder
    res.render('index');
);

我试过了:

https://github.com/expressjs/express-namespace

http://expressjs.com/en/4x/api.html

但在这两种情况下,我都需要更改我的节点 js 应用程序。

提前致谢。

【问题讨论】:

【参考方案1】:

当您想要分配域/路径时,是否应该始终修改应用程序?

不,您根本不需要修改应用程序。

当你以这种方式使用proxy_pass时,你需要用正则表达式重写URL。试试这样的:

  location ~ ^/app1/(.*)$  
    proxy_pass http://localhost:8080/$1$is_args$args; 
  

另请参阅:https://serverfault.com/q/562756/52951

【讨论】:

谢谢布拉德。就我而言,我将 localhost 更改为 127.0.0.1 并使用您的示例。我有另一个与此要求相关的问题,但与“重定向”有关。非常感谢!!

以上是关于如何使用自定义位置或路径而不是使用 nginx 的多个应用程序的根?的主要内容,如果未能解决你的问题,请参考以下文章

jqgrid更改子网格的位置或将子网格图标添加到自定义列而不是其他任何地方?

jqgrid 更改子网格的位置或将子网格图标添加到自定义列而不是其他任何地方?

在 android 中使用自定义适配器而不是正确的开始位置时从 MultiAutoCompleteTextView 中获取项目?

如何在 Android 应用程序中使用自己的自定义图像而不是谷歌地图

AWS EC2 NGINX 节点服务器 - 如何使用 Https 而不是 Http

如何使用 MemoryRouter 和 Jest 设置匹配路径? (不是位置或历史)