Koajs 路由适用于 HTTP 但无法使用 HTTPS
Koajs routes work with HTTP but broken with HTTPS
我正在使用 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 很时髦,原点 header 不见了。我无法到达我的任何路线。我想知道这是否是我的 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 配置中有特殊含义。我相信在 proxy_pass
中添加尾部斜杠(或者更确切地说,以斜杠结尾的路径)会设置 NGINX 用来将请求传递到的新 "root"。
因此,如果您使用 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;
我正在使用 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 很时髦,原点 header 不见了。我无法到达我的任何路线。我想知道这是否是我的 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 配置中有特殊含义。我相信在 proxy_pass
中添加尾部斜杠(或者更确切地说,以斜杠结尾的路径)会设置 NGINX 用来将请求传递到的新 "root"。
因此,如果您使用 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;