Kubernetes Nginx Ingress HTTP到HTTPS是通过301而不是308重定向的?

Nec*_*vil 2 kubernetes kubernetes-ingress nginx-ingress

我们正在Azure AKS上运行几个k8s群集。该服务(幽灵博客)位于Nginx入口后面,并由Letsencrypt提供的证书进行保护。所有这些都很好,但是重定向行为是我遇到的麻烦。

Ingress可以正确地从http://whatever.com重定向到 https://whatever.com-问题是它使用308重定向来做到这一点,只要用户在网站上共享页面,该重定向就会剥离所有帖子/页面元。

此问题导致在大多数社交媒体资源上共享网站任何页面的用户都收到“预览链接”(页面标题和页面元预览不起作用,而是由“ 308永久重定向”文本代替)看起来像这样:

在此处输入图片说明

从这里的ingress-nginx文档中,我可以看到这是预期的行为(即308重定向),我认为这不是在社交共享服务尝试创建页面预览时与社交共享服务的交互。

尽管默认情况下Facebook(或twitter等)直接指向https网站可以解决此问题,但我目前无法强制这些网站将要用于创建预览的内容转向https。

设置永久重定向代码

我还看到,看来我应该能够将重定向代码设置为所需的格式(我相信301重定向将使Facebook等人正确提取帖子/网页摘要元),有关该文档在这里

问题是当我按指定添加重定向代码注释时:

nginx.ingress.kubernetes.io/permanent-redirect-code: "301"
Run Code Online (Sandbox Code Playgroud)

尽管能够(从我的kubectl代理中)看到重定向代码注释正确应用,但我仍然在资源上获得308重定向。作为参考,我在Ingress上的注释的完整列表如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ghost-ingress
  annotations:
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/permanent-redirect-code: "301"
Run Code Online (Sandbox Code Playgroud)

重申-我的问题是;通过自定义错误代码(在我的情况下为301)强制重定向到https的正确方法是什么?

Ric*_*ico 5

我的猜测是TLS重定向遮盖了nginx.ingress.kubernetes.io/permanent-redirect-code注释。

您实际上可以更改,ConfigMapnginx-configuration使默认重定向为301。这就是您的nginx入口控制器用于nginx本身的配置。该ConfigMap如下所示:

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  name: nginx-configuration
  namespace: ingress-nginx
data:
  use-proxy-protocol: "true"
  http-redirect-code: "301"
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到有关ConfigMap选项的更多信息。请注意,如果更改,则必须重新启动Pod。ConfigMapnginx-ingress-controller

您还可以将其外壳安装到nginx-ingress-controllerPod中,并查看控制器创建的实际nginx配置:

kubectl -n ingress-nginx exec -it nginx-ingress-controller-xxxxxxxxxx-xxxxx bash
www-data@nginx-ingress-controller-xxxxxxxxx-xxxxx:/etc/nginx$ cat /etc/nginx/nginx.conf
Run Code Online (Sandbox Code Playgroud)