我有一个使用NextJS作为 Package 器的应用程序,我使用NextJS's dynamic routing feature。我在将它部署到CloudFront时遇到了一个问题,因为dns.com/path/page
没有被渲染,而CloudFront期望它是dns.com/path/page.html
。我通过应用这个lambda-edge-nice-url解决方案解决了这个问题。它现在工作正常。但是,还有一个问题:NextJS的动态路由. dsn.com/path/subpath/123
应该可以工作,因为123是一个动态参数,但是它不起作用,In只在我访问dns.com/path/subpath/[id]
时返回页面,当然这是不正确的,因为[id]不是我想要加载的参数。
最奇怪的是:如果我试图直接访问上面提到的URL,它会失败。2然而,在应用程序内部,我有一些按钮和链接可以重定向用户,并且可以正常工作。
从应用程序内部导航(回调中包含router.push
的按钮):
尝试直接访问URL:
有人能帮助我正确地路由请求吗?
3条答案
按热度按时间uqxowvwt1#
我使用CloudFront Lambda@Edge源请求函数将动态路由和静态路由重写到相应的HTML文件,以便CloudFront可以为任何路径提供预期的文件。
我的lambda函数看起来像
roejwanj2#
在尝试了许多不同的代码之后,我终于想出了一个Lambda边表达式,它集两个问题于一身:
.html
下面的代码首先处理动态路由。它使用一个正则表达式来理解当前的URL,并将请求重定向到正确的
[id].html
文件。之后,如果没有一个正则表达式匹配,并且URL不包含.html
扩展名,它将添加扩展名并检索正确的文件。非常感谢@LongZheng的回答。由于某种原因,他的代码对我不起作用,但对某些人可能起作用,所以请查看他的回答。另外,向Manc大吼一声,lambda-edge-nice-urls repo的创建者。我的代码基本上是两者的混合。
v440hwme3#
@Pelicer提到的解决方案实际上不能扩展到他们的解决方案之外,并且限制了路径参数的命名方式。相反,类似的方法是使用动态生成的路由文件。使用NextJS,如果运行build命令,它将在
out/.next/routes-manifest.json
输出一个路由清单。该文件看起来如下所示这为我们提供了nextjs生成的动态路由,用于静态生成的应用程序。然后,我们可以编写一个简单的CloudFront Lambda@Edge函数,在请求到来时快速Map请求。以下代码将读取上述json清单,并将请求重新路由到正确的S3路径。
注意:这里可以在静态路由和动态路由之间添加一些额外的重用。