istio通过envoyFilter实现nginx的error_page

istio通过envoyFilter实现nginx的error_page

需求:实现nginx的error_page,istio本身不支持,只能通过envoyfilter来实现。
当收到后端返回503时候,并且响应header中action为redirect时重定向跳转到首页。
ps: virtualSerivce支持自定义添加header参数。

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: 503-redirect-lua-filter
  namespace: istio-system
spec:
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: GATEWAY
      listener:
        filterChain:
          sni: "test.maple.com"
          filter:
            name: envoy.filters.network.http_connection_manager
            subFilter:
              name: envoy.filters.http.router
    patch:
      operation: INSERT_BEFORE
      value:
       name: envoy.filters.http.lua
       typed_config:
         "@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
         inlineCode: |
           function envoy_on_response(response_handle)
               if response_handle:headers():get(":status") == "503" then
                   response_handle:logInfo("Got status 503")
                   if response_handle:headers():get("action") == "redirect" then
                       response_handle:logInfo("Got status 503, redirect to login...")
                       path = response_handle:headers()
                       local xx = ""
                       for k, v in pairs(path) do
                        local tmp = k..":"..v;
                        xx = xx .. "\\n" .. tmp
                       end;
                       response_handle:logInfo(xx)
                       response_handle:headers():replace(":status", "302")
                       response_handle:headers():add("location", "http://test.maple.com/index")
                   end
               end
           end

上面是配置在在istio-system名称空间,想配置在指定namespace下,只对某个pod生效,配置如下:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: 503-redirect-lua-filter
  namespace: test
spec:
  workloadSelector:
    labels:
      app: app-web
  configPatches:
    # The first patch adds the lua filter to the listener/http connection manager
  - applyTo: HTTP_FILTER
    match:
      context: SIDECAR_INBOUND
      listener:
        portNumber: 80
        filterChain:
          filter:
            name: "envoy.filters.network.http_connection_manager"
            subFilter:
              name: "envoy.filters.http.router"
    patch:
      operation: INSERT_BEFORE
      value: # lua filter specification
       name: envoy.filters.http.lua
       typed_config:
          "@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
          inlineCode: |
            function envoy_on_response(response_handle)
                if response_handle:headers():get(":status") == "503" then
                    response_handle:logInfo("Got status 503")
                    if response_handle:headers():get("action") == "redirect" then
                        response_handle:logInfo("Got status 503, redirect to login...")
                        path = response_handle:headers()
                        local xx = ""
                        for k, v in pairs(path) do
                          local tmp = k..":"..v;
                          xx = xx .. "\\n" .. tmp
                        end;
                        response_handle:logInfo(xx)
                        response_handle:headers():replace(":status", "302")
                        response_handle:headers():add("location", "http://test.maple.com/index")
                    end
                end
            end
EOF

注意:匹配的pod必须得开启istio sidecar注入,不然不生效,之前一直没查出问题只能选择上面的配置在istio-system空间里面了。。

### 回答1: Nginxerror_page 配置用于设置错误页面的处理方式。可以使用 error_page 指令将特定的 HTTP 状态码映射到特定的错误页面。 语法: error_page 错误码 [= URL]; 例如: ``` error_page 404 /404.html; error_page 500 502 503 504 /50x.html; ``` 这样当服务器返回404状态码时,将会返回/404.html,当服务器返回500,502,503,504状态码时,将会返回/50x.html 请注意,错误页面文件必须在服务器上可用。 ### 回答2: 在Nginx中,error_page用于配置服务器遇到错误时的错误页面。具体来说,error_page指令用于定义当客户端请求的资源出现错误时所返回给客户端的页面或路径。 要配置error_page,首先需要在Nginx配置文件中指定所需的错误代码和对应的错误页面或路径。例如,以下是配置404错误的错误页面为/error/404.html的示例: ``` error_page 404 /error/404.html; ``` 在这个示例中,当服务器返回404错误时,将会将客户端重定向到/error/404.html页面。 除了简单的路径,error_page还支持其他形式的配置。例如,可以使用明确的URL来定义错误页面: ``` error_page 500 http://example.com/error/500.html; ``` 这个配置将会将500错误重定向到http://example.com/error/500.html页面。 还可以将错误页面配置为其他返回状态码的页面,例如400、503等。可以同时配置多个错误页面,Nginx会按照配置的顺序查找并使用第一个匹配的错误页面。 通过配置error_page,可以在服务器遇到错误时返回适当的错误页面,提高用户体验和处理错误的可视化。 ### 回答3: 在Nginx中,可以通过配置error_page来指定自定义的错误页面。error_page指令允许当服务器出现特定错误时指定一个自定义页面来替代默认的错误页面。 配置error_page的语法如下: ``` error_page code [target]; ``` code是需要自定义错误页面的错误码,可以是一个具体的错误码(如404),也可以是一个错误码的范围(如400-499表示所有的客户端错误)。 target是指定自定义错误页面的路径。路径可以是一个本地路径,也可以是一个远程URL。 例如,如果想指定404错误的自定义页面为`/var/www/html/404.html`,可以在Nginx的配置文件中添加如下配置: ``` error_page 404 /404.html; ``` 这样,当出现404错误时,Nginx会显示`/var/www/html/404.html`作为错误页面。 另外,可以通过配置多个error_page来指定不同错误码对应的不同自定义页面。例如: ``` error_page 404 /404.html; error_page 500 502 /50x.html; ``` 这样,当出现404错误时,会显示`/404.html`作为错误页面;当出现500或502错误时,会显示`/50x.html`作为错误页面。 需要注意的是,当指定了自定义错误页面后,Nginx会优先显示自定义页面,如果没有指定自定义页面或自定义页面不存在,才会显示默认的错误页面。 综上所述,通过配置error_page,可以方便地指定自定义错误页面,提供更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清枫cc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值