NSj*_*nas 26
从 Nextjs v12 开始,您可以使用中间件而不是设置自定义服务器。
中间件是更好的解决方案,原因如下:
创建一个/pages/_middleware.ts(或.js)文件,其内容与此类似:
import { NextFetchEvent, NextRequest, NextResponse } from 'next/server'
type Environment = "production" | "development" | "other";
export function middleware(req: NextRequest, ev: NextFetchEvent) {
const currentEnv = process.env.NODE_ENV as Environment;
if (currentEnv === 'production' &&
req.headers.get("x-forwarded-proto") !== "https") {
return NextResponse.redirect(
`https://${req.headers.get('host')}${req.nextUrl.pathname}`,
301
);
}
return NextResponse.next();
}
Run Code Online (Sandbox Code Playgroud)
import sslRedirect from 'next-ssl-redirect-middleware';
export default sslRedirect({});
Run Code Online (Sandbox Code Playgroud)
有一个带有 NPM 库的解决方案,称为heroku-ssl-redirect.
首先,使用安装库npm i heroku-ssl-redirect。
server.js然后,使用以下脚本创建一个新文件。
const next = require('next');
const express = require('express');
const sslRedirect = require('heroku-ssl-redirect').default; // to make it work with 'require' keyword.
const PORT = process.env.PORT || 3000;
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();
app.prepare().then(() => {
const server = express();
// Express's middleware to automatically redirect to 'https'.
server.use(sslRedirect());
server.all('*', (req, res) => {
return handle(req, res);
});
server.listen(port, err => {
if (err) throw err;
console.log(`Server starts on ${PORT}.`);
});
});
Run Code Online (Sandbox Code Playgroud)
然后,将start脚本更改为如下所示:
"scripts": {
"dev": "next",
"build": "next build",
"start": "node server.js"
}
Run Code Online (Sandbox Code Playgroud)
它应该有效。
请注意,您可以将 Express 替换createServer为原生 Node.jshttp模块中的方法。但我使用 Express 来简化语法。
进一步阅读:如何在 Next.js 中设置自定义服务器。
| 归档时间: |
|
| 查看次数: |
14399 次 |
| 最近记录: |