nginx rewrite 与 proxy_pass 结合使用
问题描述有这么一个需求,我需要将一个请求重写到另一个地址,然后再将这个地址代理到另一个服务。这个需求在实际开发中是很常见的,比如我们需要将一个旧的接口地址重写到新的接口地址,然后再将新的接口地址代理到后端服务。
如:请求 http://example.com/v1重写到 http://example.com/v2 然后再将 http://example.com/v2 代理到后端服务 http://127.0.0.1:8080/v2
解决方案在 Nginx 中,我们可以使用 rewrite 指令和 proxy_pass 指令来实现这个需求。
12345678server { listen 80; server_name example.com; location /v1/ { rewrite ^/v1/(.*) /v2/$1 break; proxy_pass http://127.0.0.1:8080 }
详细的参数说明:
$1:匹配的第一个括号中的内容,即请求的路径。break:表示匹配成功一次后就停 ...
/bin/sh^M: bad interpreter: No such file or directory
This worked for me:
Open file /usr/local/bin/brew with vi (vi /usr/local/bin/brew)While on vi issue this commad (via esc or :) :set fileformat=unixClose file on vi via :wq!The brew command should be OK now.
Regards.
git提交commit message规范
业界通用的 git 提交规范有哪些?
1.commitizen
AngularJS 在 github上 的提交记录被业内许多人认可,逐渐被大家引用。
格式:type(scope) : subject
scope选填表示commit的作用范围,如数据层、视图层,也可以是目录名称subject必填用于对commit进行简短的描述type必填表示提交类型,值有以下几种:
feat - 新功能 feature
fix - 修复 bug
docs - 文档注释
style - 代码格式(不影响代码运行的变动)
refactor - 重构、优化(既不增加新功能,也不是修复bug)
perf - 性能优化
test - 增加测试
chore - 构建过程或辅助工具的变动
revert - 回退
build - 打包
MySQL 8.0 及以上版本默认启用了 ONLY_FULL_GROUP_BY SQL 模式,这要求 SELECT 子句中的所有列要么出现在 GROUP BY 子句中,要么在聚合函数中使用
实际生成中遇到的sql问题,记录一下。包含场景复现sql,隐藏实际数据。
解决方法方法一:修改 GROUP BY 子句
将 sys_user.real_name、swimplat_member_record.cost_count 和 swimplat_member_ticket.type 添加到 GROUP BY中。但是这可能会返回更多的行,具体取决于这些列的值是否唯一。
123456789101112131415SELECT sys_user.real_name AS 姓名, sys_user.phonenumber AS 电话, swimplat_member_record.cost_count AS 消费次数, swimplat_member_ticket.type AS 套票类型FROM swimplat_member_recordLEFT JOIN swimplat_member_card ON swimplat_member_card.id = swimplat_member_record.member_card_idLEFT JO ...
多种编程语言接入ChatGPT详细教程:Python、JavaScript、Java、C#
使用多种编程语言接入 ChatGPT 的详细教程准备工作API 密钥获取要接入 ChatGPT,首先需要一个 OpenAI API 密钥。请按照以下步骤获取你的 API 密钥:
访问 OpenAI 官网.
登录你的账号。如果没有账号,注册一个新账号。
在用户界面中导航到“API 密钥”页面。
创建一个新的 API 密钥并将其保存到安全的地方。
安装和设置为了使用 OpenAI 的 API,你需要安装相应的库和工具。以下是每种语言的具体安装步骤。
Python 接入安装库在使用 Python 调用 OpenAI API 之前,你需要安装 openai 库。你可以使用以下命令通过 pip 安装它:
1pip install openai
示例代码下面是一个简单的 Python 代码示例,展示如何调用 ChatGPT API:
123456789101112import openaiopenai.api_key = "你的API密钥"response = openai.ChatCompletion.create( model="gpt-4", ...
hexo网站提高SEO优化方法
主要步骤
添加站点地图 sitemap.xml文件和搜索机器人文件robots.txt
提交站点到搜索引擎(百度和谷歌)
hexo针对搜索的优化
添加站点地图 sitemap.xml1.添加hexo插件
12npm install hexo-generator-sitemap --savenpm install hexo-generator-baidu-sitemap --save
2.修改_config.yml配置
1234sitemap: path: sitemap.xmlbaidusitemap: path: baidusitemap.xml
搜索机器人文件robots.txt在source目录下新建robots.txt文件,文件内容如下:
123456789101112131415User-agent: *Allow: /Allow: /archives/Allow: /categories/Allow: /tags/ Allow: /resources/ Disallow: /vendors/Disallow: /js/Disallow: /css/Disallow ...
md5彩虹表奇妙的比喻
如果将 MD5 哈希后的密文比作一把锁,暴力破解的方法就是现场制作各种各样不同齿形的钥匙,再来尝试能否开锁,这样耗时无疑很长很长。。。
我以前错误理解的 “彩虹表”,是事先制作好所有齿形的钥匙,全部拿过来尝试开锁,这样虽然省去了制作钥匙的时间,但是后来发现这些钥匙实在是太多了,没法全部带在身上。
而真正的彩虹表,是将钥匙按照某种规律进行分组,每组钥匙中只需要带最有特点的一个,当发现某个 “特征钥匙”差一点就能开锁了,则当场对该钥匙进行简单的打磨,直到能开锁为止。这种方法是既省力又省时的。
原生 js 解析 jwtToken 获取 token 中携带的信息
1234567const jwtToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ0ZXN0IiwiZXhwIjoxNzE5NDA0MDU2fQ.CZcJMXS7qYDqjJk9Dt3C3WcfmH2a4-79Q-Zenpv0jB0";let strings = jwtToken.split("."); //截取token,获取载体const userinfo = JSON.parse( window.atob(strings[1].replace(/-/g, "+").replace(/_/g, "/")));console.log("userinfo", userinfo);
python不验证密钥直接解析jwtToken第二段的内容,通过base64解析
12345def test01(): token = "t1.t2.t3" token_body = token.split('.')[1] result = json.loads(base64.b64decode(token_body + '==').decode('utf-8')) print(result)
fastapi 在响应后如果还有未被执行的 async task 将会自动执行
场景复现123456789101112async def async_test(): time.sleep(2) print("async_test", time.time()) return "success"@router.post("/test", summary="test")async def test(): task = asyncio.create_task(async_test()) # await asyncio.gather(task) time.sleep(5) return "success"
浏览器访问 /test 路由,会发现,在 5 秒后返回响应 “success” ,接着 async_test 会自动被执行,于 2 秒后打印日志。