Node.js 如何从配置了ssl的nginx提供的React应用程序向nodejs后端发送请求
我已经使用CreateReact应用程序工具为reactjs应用程序生成了静态文件。然后,我在docker容器上启动了一个nginx服务器,为使用reactjs构建的前端提供服务 服务器正在与不同容器中的节点js交互。在我将ssl证书集成到Nginx之前,该应用程序运行良好 我开始阻止跨源请求时出错:同源策略不允许读取远程资源https://ip_address:8000/api_endpoint. 两个容器托管在同一台计算机上。 以下是Nginx的配置文件:Node.js 如何从配置了ssl的nginx提供的React应用程序向nodejs后端发送请求,node.js,reactjs,nginx,ssl,Node.js,Reactjs,Nginx,Ssl,我已经使用CreateReact应用程序工具为reactjs应用程序生成了静态文件。然后,我在docker容器上启动了一个nginx服务器,为使用reactjs构建的前端提供服务 服务器正在与不同容器中的节点js交互。在我将ssl证书集成到Nginx之前,该应用程序运行良好 我开始阻止跨源请求时出错:同源策略不允许读取远程资源https://ip_address:8000/api_endpoint. 两个容器托管在同一台计算机上。 以下是Nginx的配置文件: server {
server {
#listen [::]:80;
server_name domain_name.com www.domain_name.com;
root /var/www/react_app/html;
index index.html;
#server_name affiliates-pal.com;
access_log /var/log/nginx/react-app.access.log;
error_log /var/log/nginx/react-app.error.log;
location / {
try_files $uri /index.html;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/domain_name.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/domain_name.com/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
}
server {
if ($host = www.domain_name.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = domain_name.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name domain_name.com www.domain_name.com;
return 404; # managed by Certbot
}
我应该在以下节点后端的启动脚本中为CORS定义添加任何内容吗
const express = require("express");
const bodyparser = require("body-parser");
var app = express();
var cron = require("node-cron");
var sleep = require("system-sleep");
const usersRouter = require("./api-routes");
if(process.env.IP_ADDRESS)
{
IP_ADDRESS = "http://"+process.env.IP_ADDRESS
}
else
{
IP_ADDRESS= "http://localhost:3000"
}
console.log("IP ADDRESS FROM GLOBAL VAR")
console.log(process.env.IP_ADDRESS)
console.log(IP_ADDRESS)
app.use(
bodyparser.urlencoded({
extended: true,
})
);
app.use(bodyparser.json());
var cors = require("cors");
app.use(
cors({
origin: [IP_ADDRESS],
credentials: true,
})
);
//"http://localhost:3000"
app.use(function (req, res, next) {
res.header("Access-Control-Allow-Origin", IP_ADDRESS);
res.header("Access-Control-Allow-Headers", true);
res.header("Access-Control-Allow-Credentials", true);
res.header(
"Access-Control-Allow-Methods",
"GET, POST, OPTIONS, PUT, PATCH, DELETE"
);
next();
});
app.use("/", usersRouter);
cron.schedule("40 11 10 * * *", () => {
console.log("before sleep");
sleep(20000);
console.log("after sleep");
});
const port = process.env.PORT || 8000;
app.listen(port, () => console.log(`Listening on port ${port}..`));
我是否应该按照中的建议为nginx添加代理配置?我们有相同的设置,CORS没有问题。 Nginx配置困扰着我。你能试试这个吗
server {
root /path/to/your/static/files;
index index.html index.htm index.nginx-debian.html;
server_name subdomain.domain.com(or domain.com); # CHANGE THE NAME UNDER REDIRECT BELOW AS WELL
location / {
try_files $uri $uri/ /index.html;
}
listen 443 ssl;
ssl_certificate /path/to/your/cert/fullchain.pem;
ssl_certificate_key /path/to/your/key/privkey.pem;
}
server {
if ($host = subdomain.domain.com(or domain.com)) {
return 301 https://$host$request_uri;
}
server_name subdomain.domain.com(or domain.com);
listen 80;
return 404;
}
两个容器是否在同一网络(同一docker网络)中运行?它们是否在合成文件中?是的,它们位于同一网络上。我没有使用docker compose。我目前有两个不同的docker文件。我不确定这两个容器是否在同一docker网络中运行。试着创建一个网络,在同一个网络中运行两个容器,并添加CORS中间件来表示每个源代码都通过了。我不认为这个问题与docker有关。在将ssl添加到nginx之前,两个容器之间可以进行通信。现在我得到了xhr.js:177混合内容:位于“”的页面是通过HTTPS加载的,但请求了一个不安全的XMLHttpRequest端点“”。此请求已被阻止;内容必须在google chrome中通过HTTPS提供,并且:阻止加载混合活动内容”“在Firefox中。您有节点js服务器的ssl证书吗?好的,只是确认您是在尝试提供静态文件,还是要使用反向代理来提供您在nodeJS中编写的api?@chiplusplus在我提供的文件中,我正在向nodeJS api发送请求。