JavaScript 可以在各种不同位置包含 URL。重写器不能直接解析 JavaScript 并确定出 URL 部分。需要编写一组特殊的规则来帮助 JavaScript 处理器确定和转换 URL。
具有 URL 类型的 JavaScript 元素分类如下:
<Variable name="variableName" [type="URL|EXPRESSION|DHTML|DJS|SYSTEM" source="*"]>
根据 JavaScript 变量所含值的类型,可将它们细分为以下 5 类:
变量值为可作为 URL 对待的简单字符串。
本节分为下列各小部分:
<Variable name="variableName" type="URL" [source="*"]>
其中
variableName 是变量的名称。variableName 的值会被重写(强制项)
type 是 URL 变量(强制项,其值必须是 URL)
source 是该 JavaScript 变量所在页的 URI(可选项,默认值是 *,指在任何页中)
假定基 URL 为:
http://abc.siroe.com/tmp/page.html
页内容
<script LANGUAGE="Javascript"> <!-- //URL Variables var imgsrc1="/tmp/tmp.jpg"; var imgsrc2="http://srap.sesta.com/tmp/tmp.jpg"; var imgsrc3=imgsrc2; //--> </SCRIPT>
规则
<Variable name="imgsrc*" type="URL"/>
输出
<script LANGUAGE="Javascript"> <!-- //URL Variables var imgsrc="gateway-URL/http://abc.siroe.com/tmp/tmp.jpg"; var imgsrc="gateway-URL/http://srap.sesta.com/tmp/tmp.jpg"; var imgsrc3=imgsrc2; //--> </SCRIPT>
描述
会重写 URL 类型并且名称以 imgsrc 开头的所有变量。对于输出中的第一行,在其前面加上了网关 URL 以及变量所在页的基 URL。第二行已包含绝对路径,因此只在其前面加上了网关 URL。由于第三个 var imagsrc2 的值不是字符串,而是其他 JavaScript 值,所以不会对其进行重写。
表达式变量的右侧是一个表达式。该表达式的结果是一个 URL。由于重写器无法对服务器上的此类表达式求值,所以它会向 HTML 页追加一个 JavaScript 函数 (psSRAPRewriter_convert_expression)。该函数将此表达式视为一个参数,并在客户机浏览器中对其进行求值以得出所需的 URL。
如果不确定语句中包含的是简单 URL 还是 EXPRESSION URL,则使用 EXPRESSION 规则,因为它可以处理这两种情形。
本节分为下列各小部分:
<Variable name="variableName" [type="EXPRESSION" source="*"]/>
其中
variableName 是值为表达式的 JavaScript 变量的名称(强制项)
type 是 JavaScript 变量的类型(可选项,默认值是 EXPRESSION)
source 是页的 URI(可选项,默认值是 *,指任何源)
假定页的基 URL 为:
http://abc.siroe.com/dir1/dir2/page.html
页内容
<script LANGUAGE="Javascript"> <!-- //Expression variables var expvar= getURIPreFix() + "../../images/graphics"+".gif"; document.write("<A HREF="+expvar+">Link to XYZ content</A><P>") var expvar="../../images/graphics"+".gif"; //--> </SCRIPT>
规则
<Variable name="expvar" type="EXPRESSION"/> 或 <Variable name="expvar"/>
输出
var expvar=psSRAPRewriter_convert_expression(getURIPreFix() + "../../images/graphics"+".gif");document.write("<a href="+expvar+">> Link to XYZ content</A><P>")var expvar="gateway-URL/http://abc.siroe.com/images/graphics"+".gif";
描述
会在第一行的表达式变量 expvar 右侧的前面加上函数 psSRAPRewriter_convert_expression。该函数会在运行时处理此表达式并重写相应内容。在第三行中,值被重写为一个简单的 URL。
这些变量是包含 HTML 内容的 JavaScript 变量。
本节分为下列各小部分:
<Variable name="variableName" type="DHTML" [source="*"]/>
其中
variableName 是具有 DHTML 内容的 JavaScript 变量的名称(强制项)
type 是变量的类型(强制项,其值必须是 DHTML)
source 是页的 URL(可选项,默认值是 *,指在任何页中)
假定页的基 URL 为:
http://abc.sesta.com/graphics/set1/ graphics/jsscript/JSVAR/page.html
页内容
<script LANGUAGE="Javascript"> <!-- //DHTML Var var dhtmlVar="<a href=../../images/test.html>" var dhtmlVar="<a href=/images/test.html>" var dhtmlVar="<a href=images/test.html>" //--> </SCRIPT>
规则
<Variable name="dhtmlVar" type="DHTML"/> <Attribute name="href"/> 或 <Attribute name="href" tag="a"/>
输出
<script LANGUAGE="Javascript"> <!-- //DHTML Var var dhtmlVar="<a href=gateway-URL /http://abc.sesta.com/graphics/ set1/graphics/images/test.html>" var dhtmlVar="<a href=gateway-URL/ http ://abc.sesta.com/images/test.html>" var dhtmlVar="<a href=gateway-URL/ http://abc.sesta.com/graphics/set1/ graphics/jscript/JSVAR/images/test.html>" //--></SCRIPT>
描述
JavaScript 解析器会将 dhtmlVar 的值作为 HTML 内容读取,并通过 HTML 解析器发送此内容。HTML 解析器会应用其中有 href 属性规则匹配的 HTML 规则,因此 URL 会被重写。
这些变量是包含 JavaScript 内容的 JavaScript 变量。
本节分为下列各小部分:
<Variable name="variableName" type="DJS" [source="*"]/>
其中
variable 是值为 javascript 的 JavaScript 变量。
假定页的基 URL 为:
http://abc.sesta.com/dir1/dir2/dir3/jscript/dir4/page.html
页内容
//DJS Var var dJSVar="var dJSimgsrc=\q/tmp/tmp.jpg\q;" var dJSVar="var dJSimgsrc=\q../tmp/tmp.jpg\q;" var dJSVar="var dJSimgsrc= \qhttp://abc.sesta.com/tmp/tmp.jpg\q;"
规则
<Variable name="DJS">dJSVar/> <Variable name="URL">dJSimgsrc/>
输出
//DJS Var - need 2 rules var dJSVar="var dJSimgsrc=\qgateway-URL /http://abc.sesta.com/tmp/tmp.jpg\q;"var dJSVar="var dJSimgsrc=\q gateway-URL/http ://abc.sesta.com/dir1/dir2/dir3/jscript/tmp/tmp.jpg\q;" var dJSVar="var dJSimgsrc=\qgateway-URL/ http://abc.sesta.com/tmp/tmp.jpg\q;"
描述
这里需要两项规则。第一项规则用于查找动态 JavaScript 变量 dJSVar。该变量的值同样是 URL 类型的 JavaScript。第二项规则用于重写该 JavaScript 变量的值。
这些变量是指不是由用户声明且只得到有限支持的变量。它们可用作 JavaScript 标准的一部分。例如,window.location.pathname。
本节分为下列各小部分:
<Variable name="variableName" type="SYSTEM" [source="*"]/>
其中
variableName 是 JavaScript 系统变量(强制项,其值可以是与以下模式匹配的任何值:document.URL、document.domain、location、doument.location、location.pathname、location.href、location.protocol、location.hostname、location.host 和 location.port。上述所有模式都存在于 generic_ruleset 中。不要修改这些系统变量规则。)
type 指定系统类型值(强制项,且值为 DJS)
source 是此页的 URI(可选项,默认值是 *,指在任何页中)
假定页的基 URL 为:
http://abc.siroe.com/dir1/page.html
页内容
<script LANGUAGE="Javascript"> <!-- //SYSTEM Var alert(window.location.pathname); //--> </SCRIPT>
规则
<Variable name="window.location.pathname" type="SYSTEM"/>
输出
</SCRIPT> <SCRIPT LANGUAGE="Javascript"> <!-- //SYSTEM Var alert(psSRAPRewriter_convert_pathname(window.location.pathname)); //--> </SCRIPT>
描述
重写器会查找与规则匹配的系统变量,然后在其前面加上 psSRAPRewriter_convert_system 函数。该函数会在运行时处理此系统变量并相应地重写最终得到的 URL。
值需重写的函数参数分为以下 4 类:
<Function name="functionName " paramPatterns="y,y," [type="URL|EXPRESSION|DHTML|DJS" source="*"]/>
其中
name 是 JavaScript 函数的名称(强制项)
paramPatterns 指定需要重写的参数(强制项)
y y 的位置指示需要重写的参数。例如,在语法中,第一个参数需要重写,但不能重写第二个参数
type 指定该参数所需值的类型(可选项,默认值是 EXPRESSION 类型)
source 是页的源 URI(可选项,默认值是 *,指在任何页中)
函数将该参数视为一个字符串并且该字符串可以作为 URL 对待。
本节分为下列各小部分:
<Function name="functionName" paramPatterns="y,," type="URL" [source="*"]/>
其中
name 是具有 URL 类型参数的函数的名称(强制项)
paramPatterns 指定需要重写的参数(强制项)
y y 的位置指示需要重写的参数。例如,在语法中,第一个参数需要重写,但不能重写第二个参数
type 是函数的类型(强制项,其值必须是 URL)
source 是具有该函数调用的页的 URL(可选项,默认值是 *,指在任何 URL 中)
假定页的基 URL 为:
http://abc.sesta.com/test/rewriter/test1/jscript/test2/page.html
页内容
<script language="JavaScript"> <!-- function test(one,two,three){ alert(one + "##" + two + "##" +three); } test("/test.html","../test.html","123"); window.open("/index.html","gen",width=500,height=500); //--> </SCRIPT>
规则
<Function name="URL" name="test" paramPatterns="y,y,"/> <Function name="URL" name="window.open" paramPatterns="y,,,"/>
输出
<SCRIPT language="JavaScript"> <!-- function test(one,two,three) { alert(one + "##" + two + "##" +three); } test("gateway-URL/http://abc.sesta.com/test.html"," gateway-URL/http://abc.sesta.com/test/rewriter/ test1/jscript/test.html","123");window.open("gateway-URL/ http://abc.sesta.com/index.html","gen",width=500,height=500); //--> </SCRIPT>
描述
第一项规则指定需要重写名为 test 的函数中的前两个参数。因此会重写 test 函数的前两个参数。第二项规则指定需要重写 window.open 函数的第一个参数。会在 window.open 函数中的 URL 前面加上网关 URL 以及包含函数参数的页的基 URL。
这些参数接受表达式值,表达式计算结果为 URL。
本节分为下列各小部分:
<Function name="functionName" paramPatterns="y" [type="EXPRESSION" source="*"]/>
其中
name 是函数的名称(强制项)
paramPatterns 指定需要重写的参数(强制项)
y y 的位置指示需要重写的函数参数。在上述语法中,只会重写第一个参数
type 指定 EXPRESSION 值(可选项)
source 是其中调用了该函数的页的 URI
假定页的基 URL 为:
http://abc.sesta.com/dir1/dir2/page.html
页内容
<script language="JavaScript"> <!-- function jstest2(){ return ".html"; } function jstest1(one){ return one; } var dir="/images/test" var test1=jstest1(dir+"/test"+jstest2()); document.write("<a HREF="+test1+">TEST</a>"); alert(test1); //--> </SCRIPT>
规则
<Function type="EXPRESSION" name="jstest1" paramPatterns="y"/> 或 <Function name="jstest1" paramPatterns="y"/>
输出
<script language="JavaScript"> <!-- function jstest2(){ return ".html"; } function jstest1(one){ return one; } var dir="/images/test" var test1=jstest1(psSRAPRewriter_convert_expression(dir+"/test"+jstest2())); document.write("<a HREF="+test1+">TEST</a>"); alert(test1); //--> </SCRIPT>
描述
此规则将 jstest1 函数的第一个参数视为 EXPRESSION 函数参数,以此来指定需要重写该参数。在示例页内容中,第一个参数是一个表达式,只会在运行时对其进行求值。重写器会在该表达式前加上 psSRAPRewriter_convert_expression 函数。此表达式要进行求值,并且 psSRAPRewriter_convert_expression 函数会在运行时重写输出结果。
在上述示例中,不需要在 JavaScript 变量规则中包含 test1。jstest1 的函数规则会负责执行重写工作。
值为 HTML 的函数参数
本机 JavaScript 方法(如可动态生成 HTML 页的 document.write())归属于这一类别。
本节分为下列各小部分:
<Function name="functionName" paramPatterns="y" type="DHTML" [source="*"]/>
其中
name 是函数的名称
paramPatterns 指定需要重写的参数(强制项)
y y 的位置指示需要重写的函数参数。在上述语法中,只会重写第一个参数
假定页的基 URL 为:
http://xyz.siroe.com/test/rewriter/test1/jscript/JSFUNC/page.html
页内容
<script> <!-- document.write(\q<a href="/index.html">write</a><BR>\q) document.writeln(\q<a href="index.html">writeln</a><BR>\q) document.write("http://abc.sesta.com/index.html<BR>") document.writeln("http://abc.sesta.com/index.html<BR>") //--> </SCRIPT>
规则
<Function name="DHTML" name="document.write" paramPatterns="y"/> <Function name="DHTML" name="document.writeln" paramPatterns="y"/> <Attribute name="href"/>
输出
<SCRIPT> <!-- document.write(\q<a href="gateway-URL/ http://xyz.siroe.com/index.html">write</a><BR>\q) document.writeln(\q<a href="gateway-URL/ http://xyz.siroe.com/test/rewriter/test1/ jscript/JSFUNC/index.html">writeln</a><BR>\q) document.write("http://abc.sesta.com/index.html<BR>") document.writeln("http://abc.sesta.com/index.html<BR>") //--> </SCRIPT>
描述
第一项规则指定需要重写函数 document.write 中的第一个参数。第二项规则指定需要重写函数 document.writeln 中的第一个参数。第三项规则是一项简单的 HTML 规则,它指定需要重写名为 href 的所有属性。在示例中,DHTML 参数规则将会确定函数中需要重写的参数。然后会应用 HTML 属性规则来实际重写已确定的参数。
值为 JavaScript 的函数参数。
本节分为下列各小部分:
<Function name="functionName" paramPatterns="y" type="DJS" [source="*"]/>
其中
name 是含有一个参数 DJS 的函数的名称(强制项)
paramPatterns 指定上述函数中的哪个参数是 DJS(强制项)
y y 的位置指示需要重写的函数参数。在上述语法中,只会重写第一个参数
type 为 DJS(强制项)
source 是页的 URI(可选项,默认值为 *,指任何 URI)
假定页的基 URL 为:
http://abc.sesta.com/page.html
页内容
<script> menu.addItem(new NavBarMenuItem("All Available Information","JavaScript:top.location=\qhttp://abc.sesta.com\q")); </script>
规则
<Function name="DJS" name="NavBarMenuItem" paramPatterns=",y"/> <Variable name="URL">top.location</Variable>
输出
<script> menu.addItem(new NavBarMenuItem("All Available Information", "JavaScript:top.location=\qgateway-URL/ http://abc.sesta.com\q")); </script>
描述
第一项规则指定需要重写函数 NavBarMenuItem 中的第二个包含 JavaScript 的参数。在 JavaScript 中,变量 top.location 也需要重写。该变量是使用第二项规则来重写的。