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

时间:2018-10-02 20:50:15

标签: kubernetes kubernetes-ingress nginx-ingress

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

  

Ingress正确地从http://whatever.com重定向到   https://whatever.com —问题在于它使用308   重定向,只要用户共享一个即可删除所有帖子/页面元   网站上的页面。

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

enter image description here

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

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

设置永久重定向代码

我还可以看到,我应该能够将重定向代码设置为所需的内容(我相信301重定向将使Facebook等人能够正确提取帖子/页面摘要元),{ {3}}。

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

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

2 个答案:

答案 0 :(得分:3)

我的猜测是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窗格。

您也可以进入nginx-ingress-controller窗格,并查看控制器创建的实际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

答案 1 :(得分:0)

  

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

感谢Rico提供解决方案!由于仅在Facebook上进行了测试,因此您可能会或可能不想走ConfigMap应用程序路线(Rico在上面提到过),这将通过手动编辑ConfigMap来完成,而不是使用kubectl apply -f来应用本地保存的。 >

  1. 您的cluser(az login)的皮卡AZ凭证
  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 upgrade ngx-ingress stable/nginx-ingress 其中ngx-ingress是您的头盔安装名称。还要注意,使用'--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永久重定向行为的最佳方法。

>