我是靠谱客的博主 迷你斑马,最近开发中收集的这篇文章主要介绍apisix配置http重定向到https背景开整最后refer,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

apisix配置http重定向到https

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LLSHXS10-1634265173596)(https://img.shields.io/badge/APISIX-2.10.0-brightgreen)]

背景

一般网站在使用https协议之后,都会在访问 http 站点的时候,自动 301 重定向到 https,而且百度搜索资源收录也要求你在启用https的时候,保证http能够正确的301到https,那么使用 APISIX 该怎么实现呢

开整

一般我们遇到问题,都会去百度/谷歌或官网搜一下,那么官网给出了三种方案:

  • 1 直接使用 redirect 插件(试用后没生效)
curl http://127.0.0.1:9080/apisix/admin/routes/1  -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "uri": "/hello",
    "host": "foo.com",
    "plugins": {
        "redirect": {
            "http_to_https": true
        }
    }
}'

尝试这种方法后,浏览器就一直在https重定向: ERR_TOO_MANY_REDIRECTS,应该是插件自身的问题

  • 2 使用 路由规则 vars + redirect 插件(试用仍无效)
curl -i http://127.0.0.1:9080/apisix/admin/routes/1  -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "uri": "/hello",
    "host": "foo.com",
    "vars": [
        [
            "scheme",
            "==",
            "http"
        ]
    ],
    "plugins": {
        "redirect": {
            "uri": "https://$host$request_uri",
            "ret_code": 301
        }
    }
}'

尝试这个方式后,遇到两个错误:

  • 404 Route Not Found

    scheme == https 时,发现了404的问题(具体是哪个忘记了)

    经不断尝试,大概得出 404 的原因是 route 规则 vars 没有生效,按官方的说法是按 nginx 变量来配置,用 scheme 来判断请求协议理论上是没毛病的,真正原因暂时不管

  • ERR_TOO_MANY_REDIRECTS

    和第一种方法的错误一样,从 json 上对比,其实只比第一种方法多了一个 vars

  • 3 serverless 插件(没有试过,先忽略)

点击查看详细内容
curl -i http://127.0.0.1:9080/apisix/admin/routes/1  -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "uri": "/hello",
    "plugins": {
        "serverless-pre-function": {
            "phase": "rewrite",
            "functions": ["return function() if ngx.var.scheme == "http" and ngx.var.host == "foo.com" then ngx.header["Location"] = "https://foo.com" .. ngx.var.request_uri; ngx.exit(ngx.HTTP_MOVED_PERMANENTLY); end; end"]
        }
    }
}'
  • 最终方案

既然我们相信 Apache 出品,必属精品,那就从官方的方案中改进一下方案,最终想起 nginx 中有一个属性可以拿到请求协议:http_x_forwarded_proto,在第二种方案基础上修改之后,果然成功!

curl -i http://127.0.0.1:9080/apisix/admin/routes/1  -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "uri": "/hello",
    "host": "foo.com",
    "vars": [
        [
            "http_x_forwarded_proto",
            "==",
            "http"
        ]
    ],
    "plugins": {
        "redirect": {
            "uri": "https://$host$request_uri",
            "ret_code": 301
        }
    }
}'

关于 X-Forwarded-Proto 的含义:用来确定客户端与代理服务器或者负载均衡服务器之间的连接所采用的传输协议(HTTP 或 HTTPS)。

最后

果然技术是需要长时间的积累,然后在关键时刻才能起大作用。

refer

  • nginx variables list

    这个文档里面是有 scheme 的,但没有 http-x-forwarded-proto

  • 扩展阅读 Using the Forwarded header

博客链接

最后

以上就是迷你斑马为你收集整理的apisix配置http重定向到https背景开整最后refer的全部内容,希望文章能够帮你解决apisix配置http重定向到https背景开整最后refer所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部