next.js nextJS 12中间件破坏Plesk网站

6yoyoihd  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(166)

bounty将在6天后过期。回答此问题可获得+500的声望奖励。RussellHarrower正在寻找标准答案:真的需要找到一个解决这个问题的方法。

我已经把这个问题归结到了中间件上,因为它破坏了一切。我们在Plesk上托管了这个网站,所以我们知道可能有一些服务器做得不一样。
然而,当我去https://exampl.com/appstore我应该得到一个好看的页面,但现在我得到x1c 0d1x
我已经尝试了一切来修复它,所以我想我会张贴在这里。

// middleware.ts
import { NextRequest, NextResponse, userAgent } from 'next/server'

export function middleware(request: NextRequest) {
  const { os } = userAgent(request)

  if(request.nextUrl.pathname === "/appstore")
  {
    if(os.name === "iOS"){
      return NextResponse.redirect('https://apps.apple.com/au/app/drn1/id1491656217')
    }
    if(os.name === "Android"){
      return NextResponse.redirect('https://play.google.com/store/apps/details?id=com.drn1.drn_player')
    }

 }
};

export const config = {
  matcher: [
    '/appstore'
  ],
}

不过,我可以确认,在Vercel服务器上,它工作正常-没有任何问题(https://drn-1-next-js.vercel.app/appstore)。
这让我认为这是一个plesk问题,或者是NextJS开发团队编写中间件的方式。

jslywgbw

jslywgbw1#

我认为这可能是一个问题。

  1. Plesk干扰了用户代理。当www.example.com不是您测试的网站之一时,您的代码没有回退响应(甚至只有500)os.name
  2. ===可能会有令人惊讶的效果。它不是万能的。我见过API返回 Package 值,然后===失败的情况。在使用===之前,请考虑是否有任何隐式转换会导致问题。就我所知,没有任何合理的隐式转换会导致if(os.name == "Android")产生错误匹配。
    考虑到:
> const x = 'string';
undefined
> const y = new String('string')
undefined
> x == y
true
> y == x
true
> x === y
false
> y === x
false
>

相关问题