Next Js api静态导出在iis中返回405

Posted

技术标签:

【中文标题】Next Js api静态导出在iis中返回405【英文标题】:Next Js api static export return 405 in iis 【发布时间】:2021-02-26 17:34:12 【问题描述】:

当我使用 next export 导出 NextJs 应用程序并在 iis (Windows Server 2019) 中发布时,应用 url 重写有助于每个路由可达,但只有 api 部分不可达。当我想去 api 路由时,它返回 http 405 错误。我尝试在此处附上 api 代码和项目设置, index.js

import Head from 'next/head'

export default function Home() 
return (
<div className="container">
  <Head>
    <title>Create Next App</title>
    <link rel="icon" href="/favicon.ico" />
  </Head>

  <main>
    <h1 className="title">
      Welcome to <a href="https://nextjs.org">Next.js!</a>
    </h1>

    <p className="description">
      Get started by editing <code>pages/index.js</code>
    </p>

    <div className="grid">
      <a href="https://nextjs.org/docs" className="card">
        <h3>Documentation &rarr;</h3>
        <p>Find in-depth information about Next.js features and API.</p>
      </a>

      <a href="https://nextjs.org/learn" className="card">
        <h3>Learn &rarr;</h3>
        <p>Learn about Next.js in an interactive course with quizzes!</p>
      </a>

      <a
        href="https://github.com/vercel/next.js/tree/master/examples"
        className="card"
      >
        <h3>Examples &rarr;</h3>
        <p>Discover and deploy boilerplate example Next.js projects.</p>
      </a>

      <a
        href="https://vercel.com/import?filter=next.js&utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
        className="card"
      >
        <h3>Deploy &rarr;</h3>
        <p>
          Instantly deploy your Next.js site to a public URL with Vercel.
        </p>
      </a>
    </div>
  </main>

  <footer>
    <a
      href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
      target="_blank"
      rel="noopener noreferrer"
    >
      Powered by' '
      <img src="/vercel.svg"  className="logo" />
    </a>
  </footer>

  <style jsx>`
    .container 
      min-height: 100vh;
      padding: 0 0.5rem;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
    

    main 
      padding: 5rem 0;
      flex: 1;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
    

    footer 
      width: 100%;
      height: 100px;
      border-top: 1px solid #eaeaea;
      display: flex;
      justify-content: center;
      align-items: center;
    

    footer img 
      margin-left: 0.5rem;
    

    footer a 
      display: flex;
      justify-content: center;
      align-items: center;
    

    a 
      color: inherit;
      text-decoration: none;
    

    .title a 
      color: #0070f3;
      text-decoration: none;
    

    .title a:hover,
    .title a:focus,
    .title a:active 
      text-decoration: underline;
    

    .title 
      margin: 0;
      line-height: 1.15;
      font-size: 4rem;
    

    .title,
    .description 
      text-align: center;
    

    .description 
      line-height: 1.5;
      font-size: 1.5rem;
    

    code 
      background: #fafafa;
      border-radius: 5px;
      padding: 0.75rem;
      font-size: 1.1rem;
      font-family: Menlo, Monaco, Lucida Console, Liberation Mono,
        DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace;
    

    .grid 
      display: flex;
      align-items: center;
      justify-content: center;
      flex-wrap: wrap;

      max-width: 800px;
      margin-top: 3rem;
    

    .card 
      margin: 1rem;
      flex-basis: 45%;
      padding: 1.5rem;
      text-align: left;
      color: inherit;
      text-decoration: none;
      border: 1px solid #eaeaea;
      border-radius: 10px;
      transition: color 0.15s ease, border-color 0.15s ease;
    

    .card:hover,
    .card:focus,
    .card:active 
      color: #0070f3;
      border-color: #0070f3;
    

    .card h3 
      margin: 0 0 1rem 0;
      font-size: 1.5rem;
    

    .card p 
      margin: 0;
      font-size: 1.25rem;
      line-height: 1.5;
    

    .logo 
      height: 1em;
    

    @media (max-width: 600px) 
      .grid 
        width: 100%;
        flex-direction: column;
      
    
  `</style>

  <style jsx global>`
    html,
    body 
      padding: 0;
      margin: 0;
      font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto,
        Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue,
        sans-serif;
    

    * 
      box-sizing: border-box;
    
  `</style>
</div>
)

你好.js

import  NextApiRequest, NextApiResponse  from "next";

export default async (req, res) => 
if (req.method === 'POST') 
  console.log(req)
  console.log(req.body) 
 else 
  // Handle any other HTTP method

res.statusCode = 200
res.json( trx_id: req.body.transaction_code )

package.json


"name": "learn-starter",
"version": "0.1.0",
"private": true,
"scripts": 
"dev": "next dev",
"build": "next build",
"start": "next start",
"export":"next export"
,
"dependencies": 
"next": "^10.0.0",
"react": "16.13.1",
"react-dom": "16.13.1",
"urlencoded-body-parser": "^3.0.0"
 
 

当通过 fiddler 请求时,返回以下响应,

谁能帮我解决这个问题?

** 更新:到目前为止,我无法使用静态导出来做到这一点。如果在静态文件中不可能,那么我会期待。

** 最终更新:所以经过几天的搜索和尝试,我得出的结论是 nextjs 静态导出无法帮助我实现这个输出。我求助于另一个 dot net mvc 应用程序,该应用程序接受发布的请求,处理数据,然后通过 GET 请求重定向到我的 nextjs 应用程序。由于我们使用 JWT 令牌,因此这里的身份验证没有问题。感谢大家参与这个话题。

【问题讨论】:

【参考方案1】:

当请求的处理程序未配置为禁止此 POST 动词时,您会收到此 405 method not allowed 错误。

您可以按照以下步骤解决问题。

1)打开iis manager,选择你的站点。

2)双击处理程序映射。

3) 选择 StaticFile handler 从那里点击“Request Restrictions”,然后点击“Verbs”

4)确保文本区域中存在适当的动词或选择所有动词。(在您的情况下,如果它不可用,您需要添加 POST 动词)

对 ExtensionlessUrlHandler-ISAPI-4.0 /_32bit /_64bit 处理程序执行相同的操作。

如果您仍然遇到问题,可以尝试删除 WebDAV Publishing iis 功能。

【讨论】:

我已经按照你说的做了。根本没有安装 Webdev 发布。但是 405 问题仍然存在。 @Ayan_84 API 路由不受此方法支持,因为它们无法预呈现为 HTML。 API Routes 不能与 next export 一起使用,您可以参考此链接了解更多详细信息:link1,link2 @Ayan_84 如果您觉得回复有帮助,我请求您将建议标记为答案。这将帮助面临同样问题的其他人。感谢您的理解。 它有用但不是实际的解决方案,所以我不应该将其标记为已接受的答案。相反,它引导我找到解决问题的其他解决方案。

以上是关于Next Js api静态导出在iis中返回405的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core Web API DELETE 调用返回 405

Nginx下HTML页面POST请求静态JSON数据返回405状态

Next.js 用于静态导出的动态页面参数

Next.js 中的客户端初始化与静态 HTML 导出

在生产中构建 Next.js 静态网站时获取错误

在生产中构建 Next.js 静态网站时获取错误