将参数向下传递到 ingress-nginx 中的永久重定向

Cod*_*123 3 nginx kubernetes nginx-ingress

我正在使用nginx.ingress.kubernetes.io/permanent-redirect: https://www.google.com但想在重定向中的 / 之后传递参数。但是不能让它与纯 ingress-nginx 一起工作,如果你可以设置 /$1 或类似的东西,那就太好了。这是否可以与其他注释或技巧混合使用?

例如 https://www.example.com/hello

应该重定向到 https://www.google.com/hello

aud*_*ude 7

出奇的简单:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/permanent-redirect: http://www.google.com$request_uri
spec:
  rules:
  - host: www.example.com
    http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          serviceName: test
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)

它导致这样的事情nginx.conf

if ($uri ~* /) {
        return 301 http://www.google.com$request_uri;
}
Run Code Online (Sandbox Code Playgroud)

看来您可以在地址中使用任何nginx 变量。所以我想你也可以做类似的事情$scheme://www.google.com$request_uri:)

我首先尝试了一个nginx.ingress.kubernetes.io/server-snippet像这里另一个答案中建议的块,但是redirect 301 http://www.google.com$request_uri;劫持了太多nginx.conf并阻止了证书管理器的工作。所以我需要一个更好的集成解决方案。

如果你想调试,你可以nginx.conf自己看看,真的很简单:

$ kubectl exec -n nginx-ingress nginx-ingress-controller-*** -- cat /etc/nginx/nginx.conf
Run Code Online (Sandbox Code Playgroud)


Pio*_*lec 4

可以通过以下ingress.kubernetes.io/configuration-snippet配置来执行这种重定向:

我的ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:                                                                                                                                                  
  name: ingress-redirect
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
      return 301 http://www.google.com$request_uri;
spec:
  rules:
  - host: www.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: servicename
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)

应用入口配置:

$ kubectl apply -f ingress.yaml
ingress.extensions/ingress-redirect created
Run Code Online (Sandbox Code Playgroud)

验证入口配置并检查其address.

$ kubectl describe ingress
Name:             ingress-redirect
Namespace:        default
Address:          10.156.0.33
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host             Path  Backends
  ----             ----  --------
  www.example.com  
                   /   my-nginx:80 (<none>)
Annotations:
  kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"nginx.ingress.kubernetes.io/server-snippet":"return 301 http://www.google.com$request_uri;                                                                                                        \n"},"name":"ingress-redirect","namespace":"default"},"spec":{"rules":[{"host":"www.example.com","http":{"paths":[{"backend":{"serviceName":"my-nginx","servicePort":80},"path":"/"}]}}]}}

  nginx.ingress.kubernetes.io/server-snippet:  return 301 http://www.google.com$request_uri;                                                                                                        

Events:
  Type    Reason  Age                From                      Message
  ----    ------  ----               ----                      -------
  Normal  CREATE  33m                nginx-ingress-controller  Ingress default/ingress-redirect
  Normal  UPDATE  30m (x2 over 33m)  nginx-ingress-controller  Ingress default/ingress-redirect
Run Code Online (Sandbox Code Playgroud)

最后测试重定向是否有效:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:                                                                                                                                                  
  name: ingress-redirect
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
      return 301 http://www.google.com$request_uri;
spec:
  rules:
  - host: www.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: servicename
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)

确保您的入口控制器正常运行并为入口分配 IP 地址。请注意,即使没有端点服务,重定向也可以工作。