将参数向下传递到 ingress-nginx 中的永久重定向
Passing parameters down to permanent redirect in ingress-nginx
我正在使用 nginx.ingress.kubernetes.io/permanent-redirect: https://www.google.com
,但想在重定向中的 / 之后传递参数。但是不能让它与纯 ingress-nginx 一起工作,如果你可以设置 /$1 或类似的东西,那就太好了。这可能与其他注释或技巧混合使用吗?
例如
https://www.example.com/hello
应该重定向到
https://www.google.com/hello
可以使用以下 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
应用入口配置:
$ kubectl apply -f ingress.yaml
ingress.extensions/ingress-redirect created
验证入口配置并检查其 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
最后测试 if 重定向是否有效:
$ curl -v http://10.156.0.33/test/with?some=query -H "Host: www.example.com"
* Trying 10.156.0.33...
* TCP_NODELAY set
* Connected to 10.156.0.33 (10.156.0.33) port 80 (#0)
> GET /test/with?some=query HTTP/1.1
> Host: www.example.com
> User-Agent: curl/7.52.1
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: openresty/1.15.8.2
< Date: Wed, 27 Nov 2019 13:03:08 GMT
< Content-Type: text/html
< Content-Length: 175
< Connection: keep-alive
< Location: http://www.google.com/test/with?some=query
<
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>openresty/1.15.8.2</center>
</body>
</html>
* Curl_http_done: called premature == 0
* Connection #0 to host 10.156.0.33 left intact
确保您的 ingress-controller 运行 正确并为 ingress 分配了 IP 地址。请注意,即使没有端点服务,重定向也能正常工作。
出奇的简单:
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
在nginx.conf
中会导致这样的事情:
if ($uri ~* /) {
return 301 http://www.google.com$request_uri;
}
看来您可以在地址中使用任何 nginx variable。所以我想你也可以做 $scheme://www.google.com$request_uri
之类的事情:)
我首先尝试了一个 nginx.ingress.kubernetes.io/server-snippet
块,就像这里另一个答案中建议的那样,但是 redirect 301 http://www.google.com$request_uri;
在 nginx.conf
中劫持了太多,并停止了 cert-manager 的工作。所以我需要一个更好的集成解决方案。
如果要调试,自己看nginx.conf
就可以了,真的很简单:
$ kubectl exec -n nginx-ingress nginx-ingress-controller-*** -- cat /etc/nginx/nginx.conf
我正在使用 nginx.ingress.kubernetes.io/permanent-redirect: https://www.google.com
,但想在重定向中的 / 之后传递参数。但是不能让它与纯 ingress-nginx 一起工作,如果你可以设置 /$1 或类似的东西,那就太好了。这可能与其他注释或技巧混合使用吗?
例如 https://www.example.com/hello
应该重定向到 https://www.google.com/hello
可以使用以下 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
应用入口配置:
$ kubectl apply -f ingress.yaml
ingress.extensions/ingress-redirect created
验证入口配置并检查其 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
最后测试 if 重定向是否有效:
$ curl -v http://10.156.0.33/test/with?some=query -H "Host: www.example.com"
* Trying 10.156.0.33...
* TCP_NODELAY set
* Connected to 10.156.0.33 (10.156.0.33) port 80 (#0)
> GET /test/with?some=query HTTP/1.1
> Host: www.example.com
> User-Agent: curl/7.52.1
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: openresty/1.15.8.2
< Date: Wed, 27 Nov 2019 13:03:08 GMT
< Content-Type: text/html
< Content-Length: 175
< Connection: keep-alive
< Location: http://www.google.com/test/with?some=query
<
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>openresty/1.15.8.2</center>
</body>
</html>
* Curl_http_done: called premature == 0
* Connection #0 to host 10.156.0.33 left intact
确保您的 ingress-controller 运行 正确并为 ingress 分配了 IP 地址。请注意,即使没有端点服务,重定向也能正常工作。
出奇的简单:
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
在nginx.conf
中会导致这样的事情:
if ($uri ~* /) {
return 301 http://www.google.com$request_uri;
}
看来您可以在地址中使用任何 nginx variable。所以我想你也可以做 $scheme://www.google.com$request_uri
之类的事情:)
我首先尝试了一个 nginx.ingress.kubernetes.io/server-snippet
块,就像这里另一个答案中建议的那样,但是 redirect 301 http://www.google.com$request_uri;
在 nginx.conf
中劫持了太多,并停止了 cert-manager 的工作。所以我需要一个更好的集成解决方案。
如果要调试,自己看nginx.conf
就可以了,真的很简单:
$ kubectl exec -n nginx-ingress nginx-ingress-controller-*** -- cat /etc/nginx/nginx.conf