1

我一直在寻找correct nginx configuration to achieve a server location (different from /) and get node routes working

语境

  • 在http://localhost:1337上运行的节点应用程序
  • 具有 proxy_pass 指向节点应用程序的 Nginx 服务器
  • 服务器位置属性/app
  • http请求重定向到https

Nginx 配置文件

server {
  listen         80;
  server_name    domain.com;
  return         301 https://$server_name$request_uri;
}

server {
  #listen 80 default_server;
  #listen [::]:80 default_server;

  listen 443 ssl;
  server_name domain.com;
  # add Strict-Transport-Security to prevent man in the middle attacks
  add_header Strict-Transport-Security "max-age=31536000";

  ssl_certificate /etc/nginx/ssl/nginx.crt;
  ssl_certificate_key /etc/nginx/ssl/nginx.key;

  location /app {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy true;
      proxy_pass http://127.0.0.1:1337/;
      proxy_redirect off;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_set_header   X-Forwarded-Proto $scheme;
      proxy_cache_key sfs$request_uri$scheme;
  }
}

问题

导航到www.domain.com/app时,我得到了正确的节点主页。

然后,当请求www.domain.com/app/test时,我希望它会给我带来http://localhost:1337/test。那没有发生,我得到了一个 404 not found 。所以,出于某种原因,the location isn't recognizing node routing.

奇怪的是,如果位置是 / 而不是 /app,那么一切都按预期工作。因此,问题可能与位置有关。

可能的修复

我已经尝试在位置下添加重写但没有运气:

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

您知道为什么会发生这种情况吗?

4

1 回答 1

1

如果您尝试将前端 URI 映射/app/test到上游 URI,那么您的指令/test中缺少尾随。尝试:/location

location /app/ {
    ...
    proxy_pass http://127.0.0.1:1337/;
    ...
}

请注意,两者location都有proxy_path一个尾随/.

当然,这意味着 URI/app将不再工作,但您可以通过以下方式轻松修复:

location = /app { rewrite ^ /app/ last; }

或者:

location = /app { return 301 /app/; }

有关更多信息,请参阅此文档

于 2016-01-19T22:22:51.063 回答