JavaScript 可在多個位置包含 URL。Rewriter 無法直接剖析 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 值。
EXPRESSION 變數的右側會有一個表示式。此表示式會產生一個 URL。Rewriter 會將 JavaScript 函數 (psSRAPRewriter_convert_expression) 附加至 HTML 網頁,因為其無法在伺服器上計算這類表示式的值。此函數會將表示式視為參數,並在用戶端瀏覽器中計算所需 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";
描述
psSRAPRewriter_convert_expression 函數會前置於第一行表示式變數 expvar 的右側之前。此函數可處理表示式,並於執行時間重新寫入內容。在第三行中,此值將被重新寫入為簡單 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>
描述
Rewriter 會找出與規則相符的系統變數,然後前置 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 函數參數,從而指定此參數需要重新寫入。在網頁內容範例中,第一個參數是僅在執行時間中計算其值的表示式。Rewriter 會將 psSRAPRewriter_convert_expression 函數前置於此表示式之前。從而計算此表示式,並且 psSRAPRewriter_convert_expression 函數在執行階段重新寫入輸出。
以上範例中,不需將 test1 變數作為 JavaScript 變數規則的一部分。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 變數亦需重新寫入。將使用第二個規則來重新寫入此變數。