【发布时间】:2020-04-12 05:02:01
【问题描述】:
我正在尝试使用 nodejs 和 nginx 在远程服务器上部署 Angular 应用程序。 我构建了应用程序,并使用节点应用程序为它提供服务。 Nginx 在这里充当反向代理。 我可以毫无问题地访问该网站并导航。但是,当我尝试刷新当前页面时,我的浏览器再也找不到它了:响应得到 404。
但如果我在 url 栏中输入域,我可以再次访问该网站。
有谁知道我哪里出错了?
这是节点应用程序和 nginx 的代码和配置:
var express = require('express');
var app = express(); // create our app w/ express
var morgan = require('morgan'); // log requests to the console (express4)
var bodyParser = require('body-parser'); // pull information from HTML POST (express4)
var methodOverride = require('method-override'); // simulate DELETE and PUT (express4)
const mongoose = require("mongoose");
const dotenv = require("dotenv");
const mustacheExpress = require("mustache-express");
dotenv.config();
// configuration =================
mongoose.connect(process.env.DB_CONNECT, { useNewUrlParser: true }, () => {
console.log("connected to DB !");
});
app.use(express.static("../front-end/dist/website"));
app.use(morgan('dev')); // log every request to the console
app.use(bodyParser.urlencoded({'extended':'true'})); // parse application/x-www-form-urlencoded
app.use(bodyParser.json()); // parse application/json
app.use(bodyParser.json({ type: 'application/vnd.api+json' })); // parse application/vnd.api+json as json
app.use(methodOverride());
// Middleware
app.use(express.json());
// Templating
app.engine("html", mustacheExpress());
//import routes
const authRoute = require("./routes/auth");
const devisRoute = require("./routes/devis");
const messageRoute = require("./routes/message");
const actuRoute = require("./routes/actu");
//Routes middlewares
app.use("/api/user", authRoute);
app.use("/api/sendDevis", devisRoute);
app.use("/api/message", messageRoute);
app.use("/api/actu", actuRoute);
// listen (start app with node server.js) ======================================
app.listen(3000);
server {
root /var/www/domain.com/html;
index index.html index.htm index.nginx-debian.html;
server_name domain.com www.domain.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; # m anaged by Certbot
ssl_certificate_key /etc/letsencrypt/live/domain.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.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = domain.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name domain.com www.domain.com;
return 404; # managed by Certbot
}
【问题讨论】:
-
如果你刷新主页,它总是有效吗?前端导航是使用服务器还是在客户端作为单页应用程序 (SPA) 完成?最后,您在“../front-end/dist/website”中托管了哪些文件。如果没有这些信息,我最好的猜测是您在 SPA 中使用客户端路由,并且没有每个 URL 的文件(如果有的话,很容易解决)。
-
是的,主页总是可以刷新的。导航是用 Angular 的路由器制作的,所以我认为它是在客户端完成的?我在 dist repo 中托管构建的输出(ng build --prod)。
标签: node.js angular express nginx