我最近一直在尝试使用Let的加密SSL服务将我的Web应用程序升级到https。我的应用程序是一个React前端,它在与Express后端/ api相同的AWS实例中运行。
我无法让网站的https版本正常工作,因为它向非SSL认证的Express服务器发出请求,有效地锁定了网站的https版本,无法使用后端。
我的解决方案是尝试配置NGINX块来代理Node.js服务器。我的NGINX配置并不复杂,看起来像这样:
server {
listen 443 ssl default_server;
server_name example.site.com;
root /home/ubuntu/react/build;
ssl_certificate /etc/letsencrypt/live/example.site.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.sitecom/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
location /api/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_pass http://localhost:3050/; //port where API runs
}
location / {
try_files $uri $uri/ /index.html;
add_header Cache-Control public;
expires 1d;
}
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.site.com;
return 301 https://$host$request_uri;
}
当我运行http版本时,此设置工作正常,但似乎已完全分解为https。 NGINX似乎完全忽略了/ api位置块 - 每当我尝试直接导航到/ api端点时,它会将我重定向到下面的位置块(为反应应用程序提供服务的静态文件)。我已经摆弄了各种各样的设置,并且在我的生活中无法弄清楚为什么NGINX没有考虑到/ api位置块,或者为什么SSL认证会改变它通过/读取的方式块。