借助 Secure Remote Access 的重写器组件,最终用户可以浏览内联网,方法是修改 Web 页上引用的“统一资源标识符”(Uniform Resource Identifier, URI),以使其指向网关。URI 定义了一种在任何注册名称空间中封装名称的方法,并用名称空间对名称进行标记。最常用的 URI 类型为统一资源定位符 (Uniform Resource Locators, URL)。重写器仅支持 HTTP 或 HTTPS。此支持与协议的大小写无关。重写器仅支持出现在相对 URL 中的反斜线符号。
http://abc.sesta.com\\index.html 会被重写。
而以下这些 URL 不会被重写:http:\\\\abc.sesta.com。 http:/abc.com
HTTP 标准要求 HTTP 报头或 HTML 元标记为网页指定一个字符集。但有时无法获得此信息。字符集必须已知,以便设置数据编码并按照创建者的意图显示数据。
要检测字符集,请从 Java Enterprise System Accessory CD 安装 SUNWjchdt 软件包。如果安装了此产品,重写器会检测到它,并在需要时使用。
使用此产品可能会影响性能,因此只有需要时才应安装。有关安装、配置以及使用的详细信息,参见 jcharset_readme.txt。
当用户想通过网关访问内联网网页时,可使用重写器来获得网页。重写器由 URLScraper 和网关使用。
URL Scraper 提供者可从配置的 URI 获取内容。将这些 URI 发送到浏览器之前,它会将所有相对 URI 扩展为绝对 URI。
例如,如果用户尝试用以下方式访问站点:
<a href="../mypage.html">
重写器会将其转换为:
<a href="http://yahoo.com/mypage.html">
其中 http://yahoo.com/test/ 为页面的基 URL。
有关 URLScraper 提供者的详细信息,参见 Sun Java System Portal Server 管理指南。
网关从 Internet 门户获取内容。在将内容发送到浏览器之前,它将网关 URI 追加到现有 URI 之前,使来自浏览器的后续 URI 请求可到达网关。
例如,如果有某位用户尝试用以下方式访问某台 Internet 机器上的 HTML 页面:
<a href="http://mymachine.intranet.com/mypage.html>"
重写器会在该 URL 前加上一个指向网关的引用,如下所示:
<a href="https://gateway.company.com/http://mymachine.intranet.com/ mypage.html>"
当用户单击与该锚定点相关联的某个链接时,浏览器便会与网关联络。网关会从 mymachine.intranet.com 中获取 mypage.html 的内容。
网关使用若干规则来确定要重写已获取网页的哪些要素。
有关定义规则集的详细信息,参见 Portal Server 管理指南。创建新规则集后,需要定义所需的规则。
本节涵盖以下主题:
规则集 DTD:
<?xml version="1.0" encoding="UTF-8"?> <!-- The following constraints are not represented in DTD, but taken care of programmatically 1. In a Rule, All Mandatory attributes cannot be "*". 2. Only one instance of the below elements is allowed, but in any order. 1)HTMLRules 2)JSRules 3)XMLRules 3. ID should always be in lower case. --> <!ENTITY % eURL ’URL’> <!ENTITY % eEXPRESSION ’EXPRESSION’> <!ENTITY % eDHTML ’DHTML’> <!ENTITY % eDJS ’DJS’> <!ENTITY % eSYSTEM ’SYSTEM’> <!ENTITY % ruleSetElements ’(HTMLRules | JSRules | XMLRules)?’> <!ENTITY % htmlElements ’(Form | Applet | Attribute)*’> <!ENTITY % jsElements ’(Variable | Function)*’> <!ENTITY % xmlElements ’(Attribute | TagText)*’> <!ELEMENT RuleSet (%ruleSetElements;,%ruleSetElements;,%ruleSetElements;)> <!ATTLIST RuleSet id ID #REQUIRED extends CDATA "none" > <!-- Rules for identifying rules in HTML content --> <!ELEMENT HTMLRules (%htmlElements;)> <!ELEMENT Form EMPTY> <!ATTLIST Form name CDATA #REQUIRED field CDATA #REQUIRED valuePatterns CDATA "" source CDATA "*" > <!ELEMENT Applet EMPTY> <!ATTLIST Applet code CDATA #REQUIRED param CDATA "*" valuePatterns CDATA "" source CDATA "*" > <!-- Rules for identifying rules in JS content --> <!ELEMENT JSRules (%jsElements;)> <!ELEMENT Variable EMPTY> <!ATTLIST Variable name CDATA #REQUIRED type (%eURL; | %eEXPRESSION; | %eDHTML; | %eDJS; | %eSYSTEM;) "EXPRESSION" source CDATA "*" > <!ELEMENT Function EMPTY> <!ATTLIST Function name CDATA #REQUIRED paramPatterns CDATA #REQUIRED type (%eURL; | %eEXPRESSION; | %eDHTML; | %eDJS;) "EXPRESSION" source CDATA "*" > <!-- Rules for identifying rules in XML content --> <!ELEMENT XMLRules (%xmlElements;)> <!ELEMENT TagText EMPTY> <!ATTLIST TagText tag CDATA #REQUIRED attributePatterns CDATA "" source CDATA "*" > <!ELEMENT Attribute EMPTY> <!ATTLIST Attribute name CDATA #REQUIRED tag CDATA "*" valuePatterns CDATA "" type (%eURL; | %eDHTML; | %eDJS; ) "URL" source CDATA "*" >
除必需的属性值不能只为 * 以外,您可以使用 * 作为规则值的一部分。此类规则会被忽略,但会将消息记录在 RuleSetInfo 日志文件中。有关该日志文件的信息,参见调试文件名称。
本节包含一个示例规则集。第 140 页的“案例研究”用于举例说明重写器是如何解释这些规则的。
<?xml version="1.0" encoding="ISO-8859-1"?> <!-- Rules for integrating a mail client with the gateway. --> <!DOCTYPE RuleSet SYSTEM "jar://rewriter.jar/resources/RuleSet.dtd"> <RuleSet type="GROUPED" id="owa"> <HTMLRules> <Attribute name="action" /> <Attribute name="background" /> <Attribute name="codebase" /> <Attribute name="href" /> <Attribute name="src" /> <Attribute name="lowsrc" /> <Attribute name="imagePath" /> <Attribute name="viewClass" /> <Attribute name="emptyURL" /> <Attribute name="draftsURL" /> <Attribute name="folderURL" /> <Attribute name="prevMonthImage" /> <Attribute name="nextMonthImage" /> <Attribute name="style" /> <Attribute name="content" tag="meta" /> </HTMLRules> <JSRules> <!-- Rules for Rewriting JavaScript variables in URLs --> <Variable name="URL"> _fr.location </Variable> <Variable name="URL"> g_szUserBase </Variable> <Variable name="URL"> g_szPublicFolderUrl </Variable> <Variable name="URL"> g_szExWebDir </Variable> <Variable name="URL"> g_szViewClassURL </Variable> <Variable name="URL"> g_szVirtualRoot </Variable> <Variable name="URL"> g_szBaseURL </Variable> <Variable name="URL"> g_szURL </Variable> <Function name="EXPRESSION" name="NavigateTo" paramPatterns="y"/> </JSRules> <XMLRules> <Attribute name="xmlns"/> <Attribute name="href" tag="a"/> <TagText tag="baseroot" /> <TagText tag="prop2" /> <TagText tag="prop1" /> <TagText tag="img" /> <TagText tag="xsl:attribute" attributePatterns="name=src" /> </XMLRules> </RuleSet>
编写规则的一般程序为:
确定哪些目录包含内容需重写的 HTML 页。
在这些目录中,确定需重写的页。
确定各页需重写的 URL。确定大多数 URL 的简便方法是搜索“http”和“/”。
确定 URL 的内容类型:HTML、JavaScript 或 XML。
编写上述各 URL 所需的重写规则,这可通过在 Access Manager 管理控制台的 Portal Server 配置下编辑重写器服务中的必需规则集来完成。
将所有规则合并到该域的规则集中。
当创建规则集时,请谨记以下内容:
特定主机的优先顺序以匹配最长的 URL 为基础。例如,对于以下规则集
mail1.central.abc.com|iplanet_mail_ruleset *.sfbay.abc.com|sfbay_ruleset *.abc.com|generic_ruleset
由于 sfbay_ruleset 匹配最长,因此使用它。
规则集中的规则会依次应用于页面中的每条语句,直到有一项规则与某条语句相匹配为止。
编写规则时,切记不要忘了规则的顺序。规则是按它们在规则集中的出现顺序应用于页中的语句的。如果既有特定规则又有包含 "*" 的一般规则,要先定义特定规则,然后再定义一般规则。否则,一般规则将先于特定规则应用于所有语句。
所有规则都需要包括在 <RuleSet> </RuleSet> 标记内。
在规则集的 <HTMLRules> </HTMLRules> 部分加入需要重写 HTML 内容的所有规则。
在规则集的 <JSRules> </JSRules> 部分加入需要重写 JavaScript 内容的所有规则。
在规则集的 <XMLRules> </XMLRules> 部分加入需要重写 XML 内容的所有规则。
在内联网页中,确定需要重写的 URL,并在规则集的适当部分(HTML、JSRules 或 XMLRules)加入所需规则。
将规则集分配给所需的域。
重新启动网关以使所有更改生效:
gateway-install-root/SUNWportal/bin/gateway -n gateway-profile-name start
规则集根元素有两个属性:
RuleSetName,例如,default_ruleset。在规则集到 URI 的映射中会引用此名称。
Extends。该属性是指规则集的继承功能。该值指向您希望从中派生出规则集的规则集。
可使用值 none 表示这个新的独立规则集不依赖于其他任何规则集,或者指定 RuleSetName 表示您的规则集依赖于另一规则集。
重写器使用递归功能对同一模式进行搜索,直到匹配字符串模式的末尾。
例如,重写器解析以下字符串时:
<a href="src=abc.jpg,src=bcd.jpg,src=xyz.jpg>
规则
<Attribute name="href" valuePatterns="*src=**"/>
仅重写首先出现的模式,其形式如下:
<a href="src=http://jane.sun.com/abc.jpg>
如果使用递归选项
<Attribute name="href" valuePatterns="REC:*src=**"/>;
重写器会对同一模式进行搜索,直到匹配字符串模式的末尾,因此输出为:
<a href="src=http://jane.sun.com/abc.jpg,src=http://jane.sun.com/bcd.jpg,src=http://jane.sun.com/xyz.jpg>