在编写“简单”的 cgi shell 脚本代理服务器以将引用的 xml 包装在 jsonp 样式的回调中时,我遇到了转义反斜杠的问题(通过反复试验和 Opera 出色的调试器解决了这个问题)。我仍在试图弄清楚为什么需要额外的反斜杠(8 vs. 4)。我知道每次解析都需要将反斜杠的数量加倍,但是我似乎忽略了某处的迭代,或者误解了处理。它会在浏览器中被解析两次吗?
这是我试图弄清楚它为什么工作的最终工作代码
#!/bin/sh
CB=${QUERY_STRING%%&*}
URL=${QUERY_STRING#*&}
case "$CB" in
callback=*)
printf "Content-type: application/javascript\r\n\r\n${CB##*=}(\""
wget -q --no-check-certificate -U "NetSurf/2.9 (Linux; i686)" -T 20 -O - "$URL" \
|tr -c [\ -~] " "|sed "s/[\\]/\\\\\\\\/g;s/[\"]/\\\\\"/g"
printf "\")"
;;
*)exit;;
esac
这是我正在使用的测试页面(编辑 - 替换为更简单的非 gzip 版本)。
<html><head><title>test</title></head><body><div id="notaniframe"></div>
<script>
function dummy(data){document.getElementById("notaniframe").innerHTML=data}
Loaded=0
setTimeout(function(){if(!Loaded)alert("load failed")},30000);
</script>
<script onload='Loaded=1' src="http://localhost/cgi-bin/xml2jsonp.cgi?callback=dummy&http://stackoverflow.com"></script>
</body></html>
这只是将 stackoverflow.com 塞进一个 div