【发布时间】:2019-12-11 14:42:57
【问题描述】:
我有两台服务器 A 和 B,它们都托管在 AWS 上。 A 的规则是 /v2/ 或 /v2 发送到 B。这很好用。 ServerB 是一个使用 nginx 和 express 的 NextJs 应用。
所有路由都以/v2/ 开头,所以/v2/foo 显示一个页面。该页面给出了200 的响应,但没有资产。服务器B 具有私有 IP 和公共 IP,并且转到 B:<IP>/v2/foo 的任一 IP 地址,资产加载正常。从A 去那里:<IP>/v2/foo,资产不加载所以我假设相对路径问题?
我找到了this example关于如何设置setAssetPrefix:
// server.js
const express = require('express')
const compression = require('compression');
const next = require('next')
const bodyParser = require('body-parser')
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
app.prepare()
.then(() => {
const server = express()
// Not sure what this does
app.setAssetPrefix('/v2') //??
server.use(compression())
server.use(bodyParser.json())
server.use(bodyParser.urlencoded({ extended: true }))
server.get('/v2/foo', function(req, res) {
app.render(req, res, '/v2/foo', {})
})
server.get('*', (req, res) => {
return handle(req, res)
})
server.listen(3000, (err) => {
if (err) throw err
console.log(`> Ready on ${process.env.HOST}`)
})
})
.catch((ex) => {
console.error(ex.stack)
process.exit(1)
})
使用服务器 B 的私有和公共 IP 地址可以正常工作,但是当使用服务器 A 的 url 时,页面会点击但没有样式。主页使用“css in js”并且工作正常但不是/v2/foo使用import ../../master.scss
next.config.js:
const sass = require('@zeit/next-sass')
const css = require('@zeit/next-css')
const withPlugins = require("next-compose-plugins")
const nextConfig = {
webpack(config) {
config.module.rules.push({
test: /\.svg$/,
use: ['@svgr/webpack'],
});
return config;
}
}
//https://github.com/zeit/next-plugins/issues/266#issuecomment-474721942
module.exports = withPlugins([
[sass],
[css, { cssModules: false, url: false }]
], nextConfig);
nginx:
server {
listen 80;
listen [::]:80;
root /var/www/v2/html/dist;
#index index.html index.htm index.nginx-debian.html;
server_name <public_IP> <private_IP> <server_A_domain>;
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;
}
}
【问题讨论】: