目录
弄了一个shell脚本,根据输入的请求URL、location、proxy_pass输出代理后的请求路径,简单测试了下貌似还行,有问题请留言。
数据输入格式:
request URL, location, proxy_pass 空格分开
http://localhost/api/test /api/ http://127.0.0.1:8000/
http://localhost/api/test /api/ http://127.0.0.1:8000
http://localhost/api/test /api/ http://127.0.0.1:8000/user/
http://localhost/api/test /api/ http://127.0.0.1:8000/user
去除location后,剩余部分:test
结果:http://127.0.0.1:8000/test 不需要加location http://127.0.0.1:8000/ + test
结果:http://127.0.0.1:8000/api/test 需要加location http://127.0.0.1:8000 + /api/ + test
结果:http://127.0.0.1:8000/user/test 不需要加location http://127.0.0.1:8000/user/ + test
结果:http://127.0.0.1:8000/usertest 需要加location http://127.0.0.1:8000/user + test(/api/test 去除 /api/)
http://localhost/api/test /api http://127.0.0.1:8000/
http://localhost/api/test /api http://127.0.0.1:8000
http://localhost/api/test /api http://127.0.0.1:8000/user/
http://localhost/api/test /api http://127.0.0.1:8000/user
去除location后,剩余部分:/test
结果:http://127.0.0.1:8000/test 不需要加location http://127.0.0.1:8000/ + /test
结果:http://127.0.0.1:8000/api/test 需要加location http://127.0.0.1:8000 + /api + /test
结果:http://127.0.0.1:8000/user/test 不需要加location http://127.0.0.1:8000/user/ + /test
结果:http://127.0.0.1:8000/user/test 需要加location http://127.0.0.1:8000/user + /test(/api/test 去除 /api)
测试截图:
总结:
location:
以 / 结尾:保留请求路径的后续部分。
不以 / 结尾:相对路径会被直接追加到 proxy_pass 的末尾。
proxy_pass:
以 / 结尾:请求路径的后续部分会被附加到其后。
不以 / 结尾:请求路径的后续部分会直接拼接到 proxy_pass 的路径后面。
如果proxy_pass后面没有指定路径,Nginx会将整个路径发送到后端服务器。
如果proxy_pass后面指定了路径,Nginx会移除location块中的前缀,并将剩余的路径附加到指定的路径后面。
脚本源码:
#!/bin/bash
# author: Amor
# 计算代理后URL的函数
calculate_proxied_url() {
local request_url=$1
local location=$2
local proxy_pass=$3
# 从请求URL中提取基础URL和路径
local base_url=$(echo "$request_url" | sed -E 's|https?://[^/]+||')
# 从基础URL中去除location部分
local relative_path=${base_url#$location}
#echo "$proxy_pass"
#echo "$location"
#echo "$relative_path"
# 检查proxy_pass是否以斜杠结尾
if [[ "$proxy_pass" =~ /$ ]]; then
# 如果proxy_pass以斜杠结尾,直接拼接相对路径
proxied_url="${proxy_pass}${relative_path}"
else
# 如果proxy_pass不以斜杠结尾,判断其最后一个字符
if [[ "${proxy_pass: -1}" =~ [a-zA-Z] ]]; then
# 如果proxy_pass以字母结尾,拼接location和相对路径
proxied_url="${proxy_pass}${relative_path}"
else
# 如果proxy_pass不以字母结尾,直接拼接相对路径
proxied_url="${proxy_pass}${location}${relative_path}"
fi
fi
# 去除URL中的双斜杠(协议部分除外)
proxied_url=$(echo "$proxied_url" | sed -E 's|([^:])/+|\1/|g')
echo "$proxied_url"
}
echo "*************************************************************************"
while true; do
# 读取输入
echo
read -p "请输入 request URL, location, proxy_pass 空格分开 (或输入 'exit' 退出):
输入内容: " request_url location proxy_pass
# 判断是否退出程序
if [[ "$request_url" == "exit" || "$location" == "exit" || "$proxy_pass" == "exit" ]]; then
echo "退出程序。"
break
fi
echo
# 计算代理后URL
proxied_url=$(calculate_proxied_url "$request_url" "$location" "$proxy_pass")
# 输出代理后URL
echo "代理后URL: $proxied_url"
echo
echo "*************************************************************************"
done