您提供的示例实际上不是有效的 URL,因为它没有正确转义(例如,请参阅 wikipedia 上的“Percent-encoding”)
cgi/word?http://en.wikipedia.org/wiki/Wienermobile+http://en.wikipedia.org/wiki/Apple
应该更像
cgi/word?http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FWienermobile%20http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FApple
HTTP 不是一个微不足道的协议,您最好使用框架,而不是在 shell 中编写(这增加了 shell 附带的所有陷阱的安全风险)
但只是为了好玩,这里有一个 shell 中的示例 CGI 脚本,用于解码查询字符串。
#!/bin/sh
percentdecode() {
/usr/bin/printf "$(/usr/bin/printf %s "$1" | sed -e 's/%/\\x/g; s/+/ /g')"
}
qsdecode() (
IFS=\&
for kv in $QUERY_STRING ; do
IFS==
set -- $kv
if [ $# -ne 2 ]; then
echo "Not a valid key-value pair: $kv"
continue
fi
k=$(percentdecode "$1")
v=$(percentdecode="$2")
echo "Key: $k"
echo "Value: $v"
done
}
cat <<'EOF'
Status: 200 OK
Content-Type: text/plain; charset=UTF-8
EOF
qsdecode
这会解析传统的查询字符串格式,该格式将键值存储传输为
?a=b&c=d&e=f。最好也建议您遵循这种格式格式。如果您必须使用 ?value1+value2+value3 之类的东西,那么解析起来非常简单:
decode_plusdelimited() (
unset IFS
# percentdecode maps '+' and '%20' to ' '
for value in $(percentdecode "$QUERY_STRING"); do
echo "Got value: $value"
done
)
(请注意,您没有给出加号分隔格式的精确规范,所以这只是一个近似值)