如何使用nginx-ingress-controller将www网址重定向到无www网址?

时间:2019-04-03 19:50:14

标签: redirect kubernetes-ingress nginx-ingress

我正在尝试将网址 www.example.com 本身重定向 example.com ,同时保留有关原始请求的所有内容在 k8s 1.11.1

我尝试使用简单的Ingress进行此操作,然后使用注释将其重定向。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/tls-acme: "true"
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/permanent-redirect: https://example.com
    nginx.ingress.kubernetes.io/ssl-redirect: "True"
  name: example-redirect
spec:
  tls:
  - hosts:
    - www.example.com
    secretName: example-tls
  rules:
  - host: www.example.com
    http:
      paths:
      - backend:
          serviceName: example
          servicePort: http

这里的问题是我不想有任何规则/后端。我只是想使用一个Ingress将www.example.com重定向到example.com,但是k8s Ingresses要求我有规则。这里有任何解决方法吗?

2 个答案:

答案 0 :(得分:0)

实际上,Ingress资源已经为相关API specification明确定义了先决条件。您可以从常规配置中排除rules:字段,但是应该明确指定backend:,这样在没有声明或不匹配任何规则的情况下,Nginx Ingress controller可以将网络流量路由到目标端点。

每当您通过AnnotationsConfigMaps为Nginx Ingress控制器创建任何特定设置时,这两个选项都执行相同的工作,即对基础nginx.conf文件应用某些特定配置,驻留在nginx-ingress-controller Pod上。这意味着Ingress控制器将server {}location {}块应用于特定主机的相应Nginx Web服务器Pod:

server {
        server_name www.example.com ;

        listen 80;

        listen [::]:80;

        set $proxy_upstream_name "-";

        listen 443  ssl http2;

        listen [::]:443  ssl http2;

        .............

        location / {

            set $namespace      "default";
            set $ingress_name   "example-redirect";
            set $service_name   "example";
            set $service_port   "http";
            set $location_path  "/";
            ......................
                   }
       }

因此,我假设您可以基于Ingress资源配置捕获nginx.conf文件,然后在Ingress控制器Pod中独立应用它。

我认为您也可以考虑使用nginx.ingress.kubernetes.io/from-to-www-redirect: "true" annotation来实现当前方案中的目标。

答案 1 :(得分:0)

以下应该做:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/tls-acme: "true"
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      if ($host = 'www.example.com' ) {
        rewrite ^ https://example.com$request_uri permanent;
      }
  name: example-redirect
spec:
  tls:
  - hosts:
    - www.example.com
    secretName: example-tls
  rules:
  - host: www.example.com
    http:
      paths:
      - backend:
          serviceName: example
          servicePort: http