"간단한"cgi 셸 스크립트 프록시 서버를 작성하여 jsonp 스타일 콜백에 인용 된 XML을 래핑하는 동안 시행 착오와 Opera의 뛰어난 디버거를 통해 해결 된 백 슬래시를 이스케이프 처리하는 문제가 발생했습니다. 나는 아직도 여분의 백 슬래시 세트가 필요한 이유를 알아 내려고 노력 중이다 (8 대 4). 각각의 구문 분석에서 백 슬래시의 수를 두 배로 늘려야한다는 것을 이해할 수 있지만, 어딘가에 반복을 간과하거나 처리를 오해하는 것으로 보입니다. 브라우저에서 두 번 파싱됩니까?왜 백 슬래시가 8 개 필요합니까?
이는 여기에
#!/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>
이 단지
'나오지도의/[\]/\\\\/g; s/[ "]/\\"/ g''은 정확히 내가 누락 된 내용이었습니다. 왜 이번에는 sed와 함께 큰 따옴표를 사용했는지 모르겠습니다. 감사. – technosaurus
@technosaurus : 천만에요! – ruakh