为何GatsbyJS+Traefik部署中PathPrefixStrip可用而PathPrefix无效?
嘿,这个问题其实是Gatsby路径前缀和Traefik路由规则的配合细节问题,我来给你理清楚~
首先得明确两个核心点的作用:
1. Gatsby的pathPrefix和--prefix-paths到底做了什么?
当你在gatsby-config.js里设置pathPrefix: "/environment/test",并使用--prefix-paths构建时,Gatsby不会把静态文件打包到/environment/test子目录里,而是:
- 生成的所有页面链接、静态资源(CSS/JS/图片)的引用路径,都会自动加上
/environment/test前缀; - 内部路由逻辑也会基于这个前缀来处理跳转,但静态文件的实际存储结构还是根目录(比如
public/index.html、public/about/index.html)。
2. Traefik两个路由规则的区别
咱们对比下你用到的两个规则:
PathPrefixStrip:/environment/test:
当用户请求/environment/test/xxx时,Traefik会先把前缀/environment/test剥离,再把剩下的/xxx转发给Gatsby服务。这时候服务收到的请求路径和静态文件的实际结构完全匹配(比如请求/environment/test会被转发成/,对应public/index.html;请求/environment/test/about转发成/about,对应public/about/index.html),自然能正常访问和跳转。PathPrefix:/environment/test:
这个规则会把所有以/environment/test开头的请求原封不动转发给Gatsby服务,也就是服务收到的请求是/environment/test/xxx。但Gatsby构建后的静态文件里根本没有environment/test这个子目录,服务找不到对应的资源(比如它会去寻找public/environment/test/index.html,但这个文件不存在),所以就会出现无法访问的情况。
简单来说:Gatsby的pathPrefix是给"对外的链接"加前缀,而不是给"内部文件结构"加前缀,所以需要Traefik剥离前缀后再转发,才能和静态文件的实际存储路径匹配。
内容的提问来源于stack exchange,提问作者magnusarinell

