4

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

Ingress 正确地从http://whatever.com重定向到 https://whatever.com — 问题是它使用 308 重定向来实现这一点,该重定向会在用户从网站共享页面时剥离所有帖子/页面 Meta .

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

在此处输入图像描述

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

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

设置永久重定向代码

我还可以看到,看起来我应该能够将重定向代码设置为我想要的任何内容(我相信 301 重定向将允许 Facebook 等人正确提取帖子/页面片段元),找到的文档在这里

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

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 的正确方法是什么?

4

2 回答 2

7

我的猜测是 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"

您可以在此处找到有关ConfigMap选项的更多信息。请注意,如果您更改pod,则必须重新启动您的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
于 2018-10-02T22:57:51.827 回答
0

这些方向适用于 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”标志会导致升级失败(re: https://github.com/helm/helm/issues/4337
  9. 如果您最初从 Helm 安装 nginx 时不知道您使用的名称,您可以使用helm list它来查找它。
  10. 最后,为了测试并确保您的重定向使用正确的 ConfigMap 代码,使用以下命令卷曲您的 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 永久重定向行为的最佳方法。

于 2018-10-03T14:07:02.307 回答