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

Kubernetes Nginx Ingress HTTP通过301而不是308重定向到HTTPS?,kubernetes,kubernetes-ingress,nginx-ingress,Kubernetes,Kubernetes Ingress,Nginx Ingress,我们正在Azure AKS上运行几个k8s群集。 该服务(ghost blog)位于Nginx入口后面,并由Letsencrypt的证书进行保护。所有这些都很好,但重定向行为正是我遇到的问题 入口正确地从重新定向到 -问题是它使用308 重定向,当用户共享某个页面时,该重定向会剥离所有帖子/页面元 网页从网站 该问题导致在大多数社交属性上共享网站任何页面的用户收到一个“预览链接”——其中页面标题和页面元预览无效,取而代之的是“308永久重定向”文本——如下所示: apiVersion: exte

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

入口正确地从重新定向到 -问题是它使用308 重定向,当用户共享某个页面时,该重定向会剥离所有帖子/页面元 网页从网站

该问题导致在大多数社交属性上共享网站任何页面的用户收到一个“预览链接”——其中页面标题和页面元预览无效,取而代之的是“308永久重定向”文本——如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ghost-ingress
  annotations:
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/permanent-redirect-code: "301"
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"

从中我可以看出,这是预期的行为(即308重定向),我认为不是预期的是当这些服务试图创建页面预览时与社交共享服务的交互

虽然默认情况下,Facebook(或twitter等)直接指向https站点可以解决这个问题,但我目前无法强制这些站点查找https,以获取用于创建预览的内容

设置永久重新定向代码 我还可以看到,看起来我应该能够将重定向代码设置为我想要的任何代码(我相信301重定向将允许Facebook等正确地提取帖子/页面片段元)

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

nginx.ingress.kubernetes.io/permanent-redirect-code: "301"
尽管能够(从我的kubectl代理)看到重定向代码注释正确应用,但我仍然在我的资源上获得308 re direct。作为参考,我的入口注释的完整列表如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ghost-ingress
  annotations:
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/permanent-redirect-code: "301"
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"
重申——我的问题是;通过自定义错误代码强制重定向到https的正确方法是什么(在我的例子中是301)


我猜TLS重定向阴影是
nginx.ingres.kubernetes.io/永久重定向代码注释

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

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ghost-ingress
  annotations:
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/permanent-redirect-code: "301"
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"
您可以找到有关
ConfigMap
选项的更多信息。请注意,如果更改
ConfigMap
,则必须重新启动
nginx入口控制器
pod

您还可以将外壳放入
nginx入口控制器
pod中,查看控制器创建的实际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
这些说明适用于Azure AKS用户,但此解决方案的facebook/社交财产预览链接显示为308永久重定向可能适用于任何云提供商(尽管尚未测试)-您只需更改登录/获取凭据的方式等

感谢Rico提供的解决方案!由于这仅在Facebook上测试,您可能不想也可能不想使用ConfigMap应用程序路径(Rico在上文中提到),因此这将通过手动编辑ConfigMap来实现,而不是使用
kubectl apply-f
来应用本地保存的配置

  • 为您的俱乐部拾取AZ凭据(
    AZ登录名
  • 承担集群的角色:
    az aks get credentials--resource group yourGroup--name your cluster
  • 浏览您的集群:
    az aks Browse--资源组yourGroup--命名您的集群
  • 导航到包含入口nGinx容器的名称空间(不是后端服务-尽管它们可能位于相同的NS中)
  • 在左侧导航菜单(设置上方)中,找到“ConfigMaps”选项卡并单击它
  • 编辑YAML的“Data”元素并添加以下行(注意键/值中名称和数字周围的引号):
    
    “数据”:{
    “此处的其他设置”:“false”,
    “http重定向代码”:“301”
    }
    
    除最后一行外,每个键/值行后面都需要逗号
  • 通过删除nginx控制器POD重新启动它,确保您没有像我那样删除部署
  • 如果您希望提高效率,可以升级nginx安装(从helm),这将通过使用以下命令重新启动/重新创建容器:
    helm升级ngx ingress稳定/nginx ingress
    其中ngx ingress是您头盔安装的名称。还要注意,使用“--reuse values”标志将导致升级失败(re:)
  • 如果您不知道最初从Helm安装nginx时使用的名称,您可以使用
    Helm list
    查找它
  • 最后,要测试并确保重定向使用的是正确的ConfigMap代码,请使用以下代码对http站点进行卷曲:
    curl myhttpdomain.com
    您应该会收到如下内容:
  • ```

    
    301永久搬迁
    301永久搬迁
    
    nginx/1.15.3
    ```

    这里需要注意的一件重要事情是,如果您正在对301 re direct进行更改,以尝试修复facebook或其他社交媒体属性(twitter等)的预览链接,那么这很可能不会修复您已经链接到的任何页面/帖子的任何链接,至少不会立即修复

    社交属性都使用密集缓存来限制其资源使用,但您可以通过链接到以前未引用的新页面/帖子来检查上述内容是否解决了预览链接问题

    注意“发布”的含义 因此,nginx ingress使用代码308的主要原因是,在您发送POST请求的情况下,它会保持“body”/payload完好无损(与您使用浏览器等进行的正常GET请求链接相反)

    对我来说,这不是一个问题,但如果你出于任何原因发布到http地址,并期望它被无缝地重新定向,那么这可能不起作用?