【问题标题】:Koajs routes work with HTTP but broken with HTTPSKoajs 路由适用于 HTTP,但会被 HTTPS 破坏
【发布时间】:2017-04-08 18:29:25
【问题描述】:

我正在使用letsencrypt 在我的koa2 API 上设置HTTPS,使用this DigitalOcean 指南的最后一部分。我正在使用 nginx 进行反向代理。使用 HTTP 一切正常,但使用 HTTPS 我的路由被破坏了,因为这是我第一次设置 HTTPS,我很难找到原因。例如,使用纯 HTTP,向 http://myapi.com/api/some-route 发出请求,我会看到一个类似于

的请求
{ 
  request: { 
  method: 'GET', 
  url: '/api/some-route', 
  header: { 
    'origin': 'https://myapi.com', 
    accept: '*/*' 
  } 
}

使用 HTTPS 看起来像

{ 
  request: { 
  method: 'GET', 
  url: '//some-route', 
  header: {accept: '*/*' } 
} 

request.url 很奇怪,并且缺少原始标头。我无法到达我的任何路线。我想知道这是否是我的 nginx 配置的问题,但很难弄清楚从哪里开始。

这是 nginx 配置,大部分是从the DigitalOcean guide复制而来的

server {
   listen 80;
   listen [::]:80 default_server ipv6only=on;
   return 301 https://$host$request_uri;
}

server {
  listen 443;
  server_name myapi.com;
  ssl on;
  # Use certificate and key provided by Let's Encrypt:
  ssl_certificate /etc/letsencrypt/live/myapi.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/myapi.com/privkey.pem;
  ssl_session_timeout 5m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

  location /api {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://localhost:3000/;
    proxy_ssl_session_reuse off;
    proxy_set_header Host $http_host;
    proxy_cache_bypass $http_upgrade;
    proxy_redirect off;
  }
}

【问题讨论】:

  • 在 NGINX 配置中发布 server 块,用于将请求传递到 Node 应用程序。
  • @robertklep 更新了 NGINX 配置。
  • 尾部斜线在 NGINX 中具有特殊的含义(尽管它的文档非常糟糕,我不记得它到底做了什么以及什么时候做的)。试试proxy_pass http://localhost:3000(不带斜杠)。至于缺少的Origin,您可以为此添加proxy_set_header 规则。
  • 天哪,就是这样。谢谢!想要添加答案以便我接受吗?

标签: node.js ssl nginx https koa


【解决方案1】:

尾随斜杠在 NGINX 配置中具有特殊含义。我相信在proxy_pass 中添加尾部斜杠(或者更确切地说,以斜杠结尾的路径)会设置 NGINX 用来向其传递请求的新“根”。

所以如果你使用http://localhost:3000/,NGINX 会将匹配https://your-site/api/some-route 的请求传递给http://localhost:3000//some-route(因为它使用/ 作为新的根。

如果你不添加尾部斜杠,NGINX 将按预期工作并将请求传递给http://localhost:3000/api/some-route

proxy_pass http://localhost:3000;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2017-06-12
    • 2019-02-28
    • 2015-01-05
    • 2018-07-20
    • 2013-11-30
    • 1970-01-01
    相关资源
    最近更新 更多