开发一个网页或者应用时,往往会适配计算机端和手机端,通常会将移动客户端访问的页面重定向到移动端的服务上,一般m.xxx.com此类的域名,基本都属于移动端服务。

Nginx可以通过一个请求的请求头判断客户端来源,并将其路由到指定的服务上。下面演示把来自移动端的访问重定向到移动端服务,计算机端访问保持默认即可。

1.部署移动端应用

[root@k8s-master01 ~]# kubectl create deploy phone --image=registry.cn-hangzhou.aliyuncs.com/abroad_images/nginx:phone -n study-ingress

[root@k8s-master01 ~]# kubectl expose deploy phone --port 80 -n study-ingress

2.部署移动端Ingress 实例

[root@k8s-master01 ~]# kubectl create ingress phone --rule=m.test.com/*=phone:80 -n study-ingress

上面参数说明:

  • m.test.com/*=phone:80: 这是一个规则的定义,表示将m.test.com主机的所有请求都转发到名为phone的Service上的端口80

3.部署计算机端应用

[root@k8s-master01 ~]#  kubectl create deploy laptop --image=registry.cn-hangzhou.aliyuncs.com/abroad_images/nginx:laptop -n study-ingress

[root@k8s-master01 ~]#  kubectl expose deploy laptop --port 80 -n study-ingress

4.部署计算机端Ingress 实例

编写yaml文件

[root@k8s-master01 ~]#  vim laptop-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/server-snippet: |
      set $agentflag 0;
              if ($http_user_agent ~* "(Android|iPhone|Windows Phone|UC|Kindle)" ){
                set $agentflag 1;
              }
              if ( $agentflag = 1 ) {
                return 301 http://m.test.com;
              }
  name: laptop
  namespace: study-ingress
spec:
  rules:
  - host: test.com
    http:
      paths:
      - backend:
         service:
           name: laptop
           port:
             number: 80
        path: /
        pathType: ImplementationSpecific

上面参数说明:

  • nginx.ingress.kubernetes.io/server-snippet: |: 这个注解设置一个自定义的Nginx配置片段。在这个配置片段中,根据请求的User-Agent进行了一些判断和重定向操作。下面的Nginx配置片段用于判断请求的User-Agent是否匹配指定的设备类型,如果匹配,则将请求重定向到http://m.test.com

更新Ingress 实例

[root@k8s-master01 ~]#  kubectl create -f laptop-ingress.yaml

5.在windows主机上修改hosts文件,文件路径为:C:\Windows\System32\drivers\etc\hosts

192.168.1.35 nginx.test.com m.test.com test.com

6.打开浏览器,输入m.test.com访问移动端,可以看到页面内容是Access From Android|iPhone|Windows Phone|UC|Kindle

Ingress Nginx匹配请求头-区分手机端和PC端-1

输入test.com访问计算机端,可以看到页面内容是Access From Laptop

Ingress Nginx匹配请求头-区分手机端和PC端-2

此时按F12将终端类型改为 iPhone XR

Ingress Nginx匹配请求头-区分手机端和PC端-3

刷新浏览器,观察到网站由http://test.com/变为http://m.test.com/,页面内容变为Access From Android|iPhone|Windows Phone|UC|Kindle

Ingress Nginx匹配请求头-区分手机端和PC端-4