核心代码
type Frontend struct {
Priority int `json:"priority"`
Routes map[string]Route `json:"routes,omitempty"
......
}
func (p *Provider) loadIngresses(k8sClient Client) (*types.Configuration, error) {
...
for _, r := range i.Spec.Rules {
for _, pa := range r.HTTP.Paths {
...
rule, err := getRuleForPath(pa, i)
if rule != "" {
frontend.Routes[pa.Path] = types.Route{
Rule: rule,
}
}
...
}
func getRuleForPath(pa extensionsv1beta1.HTTPIngressPath, i *extensionsv1beta1.Ingress) (string, error) {
...
rules := []string{ruleType + ":" + pa.Path}
...
if rewriteTarget != "" {
rewriteTargetRule := fmt.Sprintf("ReplacePathRegex: ^%s(.*) %s$1", pa.Path, strings.TrimRight(rewriteTarget, "/"))
if pa.Path == "/" {
rewriteTargetRule = fmt.Sprintf("ReplacePathRegex: ^(.*) %s$1", strings.TrimRight(rewriteTarget, "/"))
}
rules = append(rules, rewriteTargetRule)
}
...
return strings.Join(rules, ";"), nil
}
func buildServerRoute(serverEntryPoint *serverEntryPoint, frontendName string, frontend *types.Frontend, hostResolver *hostresolver.Resolver) (*types.ServerRoute, error) {
serverRoute := &types.ServerRoute{Route: serverEntryPoint.httpRouter.GetHandler().NewRoute().Name(frontendName)}
priority := 0
for routeName, route := range frontend.Routes {
rls := rules.Rules{Route: serverRoute, HostResolver: hostResolver}
...
priority += len(route.Rule)
}
if frontend.Priority > 0 {
serverRoute.Route.Priority(frontend.Priority)
} else {
serverRoute.Route.Priority(priority)
}
return serverRoute, nil
}
Path1,rewrite | Path2,rewrite | 情况 |
---|
开 | 开 | path1优先匹配 |
开 | 关 | path1优先匹配 |
关 | 开 | path2优先匹配 |
关 | 关 | path1优先匹配 |
- 已有path1:/a/b,新提交path2:/a/b/c
Path1,rewrite | Path2,rewrite | 情况 |
---|
开 | 开 | path2优先匹配 |
开 | 关 | path1优先匹配 |
关 | 开 | path2优先匹配 |
关 | 关 | path2优先匹配 |