【问题标题】:Kubernetes Nginx Ingress HTTP to HTTPS redirect via 301 instead of 308?Kubernetes Nginx Ingress HTTP 到 HTTPS 通过 301 而不是 308 重定向?
【发布时间】:2019-03-08 01:02:52
【问题描述】:

我们正在 Azure AKS 上运行几个 k8s 集群。 该服务(幽灵博客)位于 Nginx 入口的后面,并使用 Letsencrypt 的证书进行保护。所有这些都可以正常工作,但重定向行为是我遇到的问题。

Ingress 正确地从 http://whatever.com 重定向到 https://whatever.com — 问题在于它使用 308 重定向会在用户共享时删除所有帖子/页面元 来自网站的页面。

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

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

虽然问题将通过 Facebook(或 twitter 等)默认指向 https 站点来解决,但我目前无法强制这些站点在 https 中查找将用于创建预览。

设置永久重定向代码

我还可以看到,我应该能够将重定向代码设置为我想要的任何内容(我相信 301 重定向将允许 Facebook 等人正确地提取帖子/页面 sn-p 元数据) , docs on that found here.

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

nginx.ingress.kubernetes.io/permanent-redirect-code: "301"

尽管能够(从我的 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"

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

【问题讨论】:

  • 是什么让您认为您需要 301,您确定吗?
  • @rico 我敢肯定,对于任何从社交分享获得大量流量的网站来说,308 会导致显着次优的结果。基本上,链接(在社交或通过文本共享时)会导致该服务尝试获取元数据的 sn-p 以构建预览 - 如果单击链接,308 重定向确实有效,但预览看起来像垃圾并显示标题页面为“308 重定向”(字面意思)。大多数用户不知道这是什么,因此不会点击。当然,我个人可以只分享 https 链接,但我不能强迫我的用户也这样做。
  • ...在预览中看起来很糟糕,字符用完了:)
  • 添加了一个答案,希望对您有所帮助。

标签: kubernetes kubernetes-ingress nginx-ingress


【解决方案1】:

这些说明适用于 Azure AKS 用户,但显示为 308 永久重定向的 facebook/社交属性预览链接的解决方案可能适用于任何云提供商(尽管尚未经过测试)——您只需要更改您登录/获取凭据等的方式。

感谢 Rico 的解决方案!由于这仅在 Facebook 上进行了测试,您可能希望也可能不希望使用 ConfigMap 应用程序路线(Rico 上面提到过),这将介绍手动编辑 ConfigMap,而不是使用 kubectl apply -f 应用本地保存的应用程序。

  1. 为您的集群获取 AZ 凭证 (az login)
  2. 为您的集群担任角色:az aks get-credentials --resource-group yourGroup --name your-cluster
  3. 浏览您的集群:az aks browse --resource-group yourGroup --name your-cluster
  4. 导航到包含 Ingress nGinx 容器的命名空间(不是后端服务,尽管它们可能在同一个 NS 中)。
  5. 在左侧导航菜单(就在设置上方)找到“ConfigMaps”选项卡并单击它。
  6. 编辑 YAML 的“数据”元素并添加以下行(注意键/值中名称和数字的引号): "data": { "some-other-setting-here": "false", "http-redirect-code": "301" } 除最后一行外,每个键/值行后面都需要一个逗号。
  7. 通过删除 nginx-controller POD 重新启动它确保您不会像我一样删除部署。
  8. 如果您想提高工作效率,您可以升级您的 nginx 安装(从 helm),这将在此过程中重新启动/重新创建容器,方法是: helm upgrade ngx-ingress stable/nginx-ingress 其中 ngx-ingress 是您的 helm 安装的名称。另请注意,使用“--reuse-values”标志会导致升级失败(回复:https://github.com/helm/helm/issues/4337
  9. 如果您不知道最初从 Helm 安装 nginx 时使用的名称,可以使用 helm list 查找。
  10. 最后要测试并确保您的重定向使用正确的 ConfigMap 代码,使用以下命令 curl 您的 http 站点: curl myhttpdomain.com 您应该会收到如下信息:

```

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.15.3</center>
</body>
</html>

```

这里要注意的重要一点是,如果您要更改 301 重定向以尝试修复 facebook 或其他社交媒体属性之一(推特等)的预览链接,那么很可能会发生这种情况不会修复指向您已经链接到的任何页面/帖子的任何链接——至少不会立即修复。

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

注意“POST”的含义

所以 nginx-ingress 使用代码 308 的主要原因是因为它在您发送 POST 请求的情况下保持“主体”/有效负载完好无损(与您使用浏览器等执行的普通 GET 请求链接相反) )。

对我来说,这不是问题,但如果您出于某种原因发帖到 http 地址并期望它可以无缝重定向,那可能无法正常工作 - 在您切换到帖子中讨论的 301 重定向之后.

但是,如果您在发送 POST 请求时不期望无缝重定向(我认为大多数人可能不是,我知道我不是),那么我认为这是修复 Facebook 308 永久重定向行为的最佳方法。

【讨论】:

    【解决方案2】:

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

    您实际上可以将ConfigMap 更改为nginx-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"
    

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

    您还可以进入nginx-ingress-controller 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
    

    【讨论】:

    • 会在上午试一试。 @里科。我还在我原来的问题中添加了一个屏幕截图,以明确问题是什么以及由 308 重定向行为引起的视觉结果(从用户的角度来看)。我认为在野外可能有很多这个问题的实例,但是因为大多数时候人们都在共享完整的链接(使用 HTTPS),所以它没有被注意到。
    • 刚刚试过上面的ConfigMap方案。请注意,您需要在“301”代码周围加上引号。不知道这是否会解决整体问题,但这确实会强制 nGinx Ingress 使用 301 代码——facebook、twiiter 和其他社交属性现在是否会正确“找到”/创建预览元尚不清楚——我会发布回来对这个过程有任何额外的想法。
    • 谢谢,添加了引号。
    猜你喜欢
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    相关资源
    最近更新 更多