内容


针对您的 WebSphere Commerce 站点改善搜索引擎优化结果

Comments

引言

假设有一定数量的潜在客户正在搜索产品和服务,例如,此刻正在搜索您的产品和服务。贵公司的网站是否进行了良好设计,以确保潜在客户在使用搜索引擎时可以找到您的站点?越来越多的在线零售商正在将其营销重点转向搜索引擎营销。

利用搜索引擎优化 (SEO),您可以通过搜索引擎提高在线可见度,生成更大的在线流量并促使更多的客户访问您的站点。前一篇文章 提高 WebSphere Commerce 站点的流量 集中讨论了有助于进行搜索引擎优化的通用技术,而本文将集中讨论如何设置 WebSphere® Commerce 站点以进行搜索引擎优化。

影响搜索索引和排名的因素有许多。只更改站点的一个方面可能无法保证得到改善。您需要同等地考虑所有选项并经常使用搜索引擎进行核查,因为算法常常会在不另行通知的情况下更改。通过实现本文中描述的一些或所有技术,从而开始您的 SEO 工作。产生的结果可能会因搜索引擎和日期而异。您需要在进行每一项更改后主动地监视您的站点。

本文先介绍 WebSphere Commerce 的若干功能,这些功能可以使搜索引擎为您的尽可能多的 URL 建立索引。然后再介绍有关如何改善搜索排名结果的更多技术。最后,将会提供有关使用动态缓存功能来实现 SEO 以使站点达到最优性能的建议。

自定义 WebSphere Commerce URL 映射

URL 映射功能提供了一些即时可用的基本自定义功能。例如,用户可以在 URL_Mapping_File 中更改参数分隔符或外部请求标识符。然而,更有意义的 URL 会包含诸如“ConsumerDirect”(而不是“10001”存储 ID)之类的存储名称以标识存储。此外,您可以指定“English”(而不是“-1”)作为 URL 中的语言。此类映射并不是以即时可用的方式提供的,不过,您可以创建一个自定义的 URL 映射器实现类。在接下来的部分中,我们将提供一个示例。

自定义输入参数值

URL 映射功能由用于实现“com.ibm.commerce.datatype.UrlMapper.java”接口的 Java™ 类提供。该实现类的名称在 WebSphere Commerce 配置文件中定义。

对于 WebSphere Commerce 5.6 和 5.6.1 版,WebSphere Commerce 配置文件位于:

<WC_Install_Directory>/instances/<InstanceName>/xml/<InstanceName.xml>.

对于 WebSphere Commerce 6.0 版,WebSphere Commerce 配置文件则位于:

<WebSphere_Install_Directory>/profiles/<ProfileName>/installedApps/<CellName>/
<WC_instance.ear>/xml/config/wc-server.xml.

在以下示例中,我们将创建一个新的自定义 URL 映射器 com.ibm.commerce.sample.customer.CustomerUrlMapperImpl.java,该映射器从 com.ibm.commerce.datatype.UrlMapperImpl.java 类扩展。我们还将定义一个新的自定义 URL 映射器 xml 文件 CustomerUrlmapper.xml。在该映射器文件中,我们会添加一个部分以定义参数值的映射。

图 1 显示了 URL 映射器组件的即时可用的配置。

图 1. 即时可用的 URL 映射器配置
<component compClassName="com.ibm.commerce.datatype.UrlMapperConfig"
               enable="true"
               name="UrlMapperConfig">
      <property 
UrlMapperFile="C:/WebSphere/CommerceServer/xml/mapping/newUrlmapper.xml"
               UrlMapperClassName="com.ibm.commerce.datatype.UrlMapperImpl"
               display="false" />
</component>

图 2 显示了该自定义示例所需的配置。

图 2. 新的自定义 URL 映射器配置
<component compClassName="com.ibm.commerce.datatype.UrlMapperConfig"
               enable="true"
               name="UrlMapperConfig">
        <property
        
UrlMapperFile="C:/WebSphere/CommerceServer/xml/mapping/CustomerUrlmapper.xml"

UrlMapperClassName="com.ibm.commerce.sample.customer.CustomerUrlMapperImpl"
  display="false" />
</component>

图 3 提供了新的 CustomerUrlMapper.xml 文件的示例。在此 URL_Mapper_File 中,我们引入了一个新的 <parameter_mapping> 元素,我们在该元素下为 storeId 和 langId 定义从外部值到内部值的映射。

图 3. 示例 CustomerUrlMapper.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- A sample mapping file : CustomerUrlMapper.xml -->
<mappings>
<pathInfo_mappings separator="_">
<pathInfo_mapping name="topcategory" requestName="TopCategoriesDisplay" >
		<parameter name="langId" />	
		<parameter name="storeId" />     
		<parameter name="catalogId" />	
</pathInfo_mapping>
<pathInfo_mapping  name="category" requestName="CategoryDisplay" >
		<parameter name="langId" />	
		<parameter name="storeId" />     
		<parameter name="catalogId" />    
		<parameter name="categoryId" />       
</pathInfo_mapping>
</pathInfo_mappings>
<parameter_mapping>
	<parameter name = "storeId" >
		<map extValue="ConsumerDirect" intValue="10001" />
		<map extValue="ToolTech" intValue="10002" />			
	</parameter>
	<parameter name = "langId" >
		<map extValue="English" intValue="-1" />
		<map extValue="French" intValue="-2" />		
	</parameter>

</parameter_mapping>
</mappings>

自定义 URL 映射器 CustomerUrlMapperImpl 类除了执行 UrlMapperImpl 基类提供的功能之外,还必须执行两个额外的功能:

  1. 加载自定义 URL 映射文件中定义的参数值映射。
  2. 针对每个接收到的请求将参数值从外部值转换为内部值。

可通过扩展 UrlMapperImpl 基类的 init() 方法(参见图 4)和 extractRequestParameters() 方法(参见图 5)来执行此操作。在 init() 方法中,您通过解析 URL 映射器文件的 <parameter_mapping> 元素来创建参数值映射。在 extractRequestParameters() 方法中,您将参数值从其外部值映射到其内部值。图 6 是 CustomerUrlMapperImpl.java 类的全面实现。

图 4. CustomerUrlMapper.java 的 init() 方法扩展了基方法
 /**
     * Initialize the url mapper. This method is called during initialization 
     * to load the mapper definition file.
     *  
     * @param filename The url mapper definition xml file
     * @exception Exception caught during initialization
     */
    public void init(String filename) throws Exception {
        super.init(filename);
        if (filename != null) {
            // load the mapping for parameter values
            initializeParameterValuesMap(filename);
        }
   }
图 5. CustomerUrlMapperImpl 类中的 extractRequestParameters 方法
/**
     * Extracts additional parameters from the pathInfo that contains multiple
     * parameters.
     * 
     * @param pathInfo  External path information
     * @param reqId  Request identifier
     * @param prop Input property, the extracted properties will be added to 
     *    this input property object.
     * @return Returns the internal request name.
     */
    public String extractRequestParameters(String reqId, String pathInfo,
            TypedProperty prop) {
        String reqname = super.extractRequestParameters(reqId, pathInfo, prop);
        // convert from external value to internal value
        mapParameterValues(prop);
        return reqname;
    }
图 6. CustomerUrlMapperImpl.java
/**
 *
 * CustomerUrlMapperImpl
 */
package com.ibm.commerce.sample.customer;

/*
 *-------------------------------------------------------------------
 * OCO Source Materials
 *
 * WebSphere Commerce
 *
 * (c) Copyright International Business Machines Corporation.
 *     2006
 *     All rights reserved.
 *
 * The source code for this program is not published or otherwise
 * divested of its trade secrets, irrespective of what has been
 * deposited with the US Copyright Office.
 *-------------------------------------------------------------------
 */

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.ibm.commerce.datatype.TypedProperty;
import com.ibm.commerce.datatype.UrlMapperImpl;

/**
 * This is a sample URL mapper implementation that allows one to map the input
 * parameter value to an internal values required by the command. For example,
 * this implementation allows one to specify "English" instead or "-1" 
 * as the language Id or store name such as "ConsumerDirectFurniture" 
 * instead of a  * number"10001" in the input URL in addition to the basic 
 * URL mapper function. 
 *  
 */
public class CustomerUrlMapperImpl extends UrlMapperImpl {
    private static Map parameterMap = new HashMap();

    private static Object[] mappedParameters = null;

    /**
     * Initialize the url mapper. This method is called during initialization
     * to load the mapper definition file.
     *  
     * @param filename The url mapper definition xml file
     * @exception Exception caught during initialization
     */
    public void init(String filename) throws Exception {
        super.init(filename);
        if (filename != null) {
            // load the mapping for parameter values
            initializeParameterValuesMap(filename);
        }
    }

    /**
     * Extracts additional parameters from the pathInfo that contains multiple
     * parameters.
     * 
     * @param pathInfo External path information
     * @param reqId Request identifier
     * @param prop Input property, the extracted properties will be added to 
     *  this input property object.
     *            <p>
     * @return Returns the internal request name.
     */
    public String extractRequestParameters(String reqId, String pathInfo,
            TypedProperty prop) {
        String reqname = super.extractRequestParameters(reqId, pathInfo, prop);
        // convert from external value to internal value
        mapParameterValues(prop);
        return reqname;
    }
    /**
     * Convert from external to internal parameter values for
     * properties that has a mapping defined.
     * 
     * @param prop The typed property object
     */
    private static void mapParameterValues(TypedProperty prop) {

        if (mappedParameters != null) {
            String pName = null;
            String[] extValues = null;
            // go through list of mapped parameters
            for (int i = 0; i < mappedParameters.length; i++) {
                pName = (String) mappedParameters[i];
                extValues = (String[]) prop.get(pName, null);
                if (extValues != null && extValues.length > 0) {
                    mapExtToIntValue((Map) parameterMap.get(pName), extValues);
                }
            }
        }

    }
    /**
     * Map from external to internal value.
     * <p>
     * @param extToIntMap The map from external to internal value
     * @param extValues The external values parameter value
     * @return
     */
    private static String[] mapExtToIntValue(Map extToIntMap, String[] 
    extValues) {
        String intValue = null;
        for (int i = 0; i < extValues.length; i++) {
            intValue = (String) extToIntMap.get(extValues[i]);
            if (intValue != null) {
                // there is a defined mapping for the external value
                extValues[i] = intValue;
            }
        }
        return extValues;
    }

    /**
     * This method parses the parameter_mapping node to initialize the 
     * additional mapping for parameter values.
     * 
     * @param filename The url mapper definition xml file
     * @exception Exception caught during initialization
     */
    private void initializeParameterValuesMap(String filename) throws Exception 
    {
        try {
            DocumentBuilderFactory bldrFactory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder docBldr = bldrFactory.newDocumentBuilder();
            Document doc = docBldr.parse(filename);
            Node root = doc.getDocumentElement();

            for (Node node = root.getFirstChild(); node != null; node = node
                    .getNextSibling()) {
                if (node.getNodeName().equals("parameter_mapping")
                        && node.getNodeType() == Node.ELEMENT_NODE) {
                    NodeList nlist = ((Element) node)
                            .getElementsByTagName("parameter");
                    if (nlist != null && nlist.getLength() > 0) {
                        List pNames = new ArrayList();
                        String extValue = null;
                        String intValue = null;
                        String paramName = null;
                        Element parameter = null;
                        Node map = null;
                        for (int i = 0; i < nlist.getLength(); i++) {
                            parameter = (Element) nlist.item(i);
                            paramName = ((Element) parameter)
                                    .getAttribute("name");
                            NodeList pNodes = parameter
                                    .getElementsByTagName("map");

                            if (pNodes != null && pNodes.getLength() > 0) {
                                Map paramValueMap = new HashMap();
                                for (int j = 0; j < pNodes.getLength(); j++) {
                                    map = pNodes.item(j);       
                                    extValue = ((Element) map)
                                            .getAttribute("extValue");
                                    intValue = ((Element) map)
                                            .getAttribute("intValue");
                                    if (extValue != null
                                            && !intValue.equals("")) {
                                        if (intValue != null
                                                && !intValue.equals("")) {
                                            paramValueMap.put(extValue,
                                                    intValue);
                                        }
                                    }
                                }
                                parameterMap.put(paramName, paramValueMap);
                                pNames.add(paramName);
                            }
                        }
                        if (pNames.size() > 0) {
                            mappedParameters = pNames.toArray();
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

为了阐释通过上述代码实现的行为,将在下面提供一些示例。在下列示例中,您将会使用图 3 中定义的 CustomerUrlMapper.xml。

示例 1

如果输入 URL 是:

http://myhost/webapp/wcs/stores/servlet/topcategory_English_ConsumerDirect_10001

则 extractRequestParameters 的输入参数将是:

  • pathInfo = topcategory_English_ConsumerDirect_10001
  • reqId = topcategory
  • prop = an empty TypedProperty object

从 UrlMapperImpl 基类中返回的输出参数将是“TopCategoriesDisplay”。

prop 参数将包含以下两个属性:

  • langId = { English }
  • storeId = { ConsumerDirect }

在调用 mapParameterValues() 之后,这些属性将会更改为:

  • langId = { -1 }
  • storeId = { 10001 }

示例 2

如果输入 URL 是:

http://myhost/webapp/wcs/stores/servlet/category_French_ConsumerDirect_10001_10001

则 extractRequestParameters 的输入参数将是:

  • pathInfo = category_French_ConsumerDirect_10001_10001
  • reqId = category
  • prop = an empty TypedProperty object

从 UrlMapperImpl 基类中返回的输出参数将是“CategoryDisplay”。

prop 参数将包含以下两个属性:

  • langId = { French }
  • storeId = { ConsumerDirect }

在调用 mapParameterValues() 之后,这些属性将会更改为:

  • langId = { -2 }
  • storeId = { 10001 }

因此,通过这个新的 CustomerUrlMapperImpl.java 类和 CustomerUrlMapper.xml,您现在就可以使用以下 URL:

http://myhost/webapp/wcs/stores/servlet/category_French_ConsumerDirect_10001_10001

而不用使用以下更为隐晦的内容:

http://myhost/webapp/wcs/stores/servlet/category_-2_10001_10001_10001

使用关键字而不使用 ID

当搜索引擎分析某个页面时,一些特定位置会比其他位置更为重要。如果某个页面的 URL 包含搜索引擎正在查找的关键字,则该搜索引擎会认为该页面更为相关。

最后一部分中的技术提供了用于将 ID 更改为更有意义的字词的方法。对不常更新的值(如存储名称)使用上述技术将会很有用。然而,对于目录页面,由于这些页面存在许多产品的信息并且经常在其上更新或添加目录,因此,在 URL 映射文件中放入产品 ID 和关键字之间的所有映射并不是一个好主意。本部分提供了使用关键字的备选方法,而不是将 ID 放入目录页面的 URL 中。

WebSphere Commerce 的 CategoryDisplay 命令可以采用 catalogIdentifier 而不用采用 catalogId,而且该命令还可以采用标识符而不采用 categoryId。有关更多信息,请参阅WebSphere 信息中心:ProductDisplay URL

您可以利用该命令来使用关键字,而不是将 ID 放入目录页面的 URL 中。在下面的示例中,假设 catalogId 10001 具有 catalogIdentifier “Hardware”,并且 categoryId 10001 的标识符为“Laptop”,那么,URL 可能与以下示例类似:/IBMCategory_Hardware_Laptop_10001_-1。在本例中,URL 会包含更多的关键字。

对于本示例,以下是映射文件的代码段:

<pathInfo_mappings separator="_"  >
<pathInfo_mapping name=" IBMCategory"  requestName="CategoryDisplay">
   <parameter name="catalogIdentifier" />
   <parameter name="identifier" />
   <parameter name="storeId" />
   <parameter name="langId" />
</pathInfo_mapping>
示例 1
示例 1

类似地,WebSphereCommerce ProductDisplay 命令可以采用 partNumber 作为输入,而不采用 productId。有关更多信息,请参阅WebSphere Commerce 信息中心:ProductDisplay URL。在下面的示例中,假设 productId 10001 的 partNumber 是 Laptop40,那么,URL 将与以下所示类似:/IBMProduct_Laptop40_10001_10001_-1

对于本示例,以下是映射文件的代码段:

<pathInfo_mappings separator="_"  >
<pathInfo_mapping name="IBMProduct" requestName="ProductDisplay">
   <parameter name="partNumber" />
   <parameter name="storeId" />
   <parameter name="catalogId" />
   <parameter name="langId" />
</pathInfo_mapping>
示例 2
示例 2

TopCategoriesDisplay 命令也可以采用标识符作为输入,而不采用 catalogId。您可以使用同样的技术,以使 URL 将会包含关键字,而不是 ID。

在下面接下来的示例中,会将“/”用作分隔符,而不使用“_”。在本例中,URL 将类似于 /IBMCategory/Hardware/Laptop/10001/-1,,而不类似于 /IBMCategory_Hardware_Laptop_10001_-1。然而,如果将“/”用作分隔符,则其缺点为:JSP 中的所有路径将需要是绝对路径(例如,http://hostname/webapp/wcs/stores/servlet/...),因为“/”在标准中具有其自己的含义。

若要表明分隔符是“/”,请在映射文件中使用以下内容:

<pathInfo_mappings separator="/" …  >
…
示例 3
示例 3

将相关的关键字添加到 URL 中的另一种方法是将关键字参数引入到映射文件中。此关键字参数并不由 WebSphere Commerce 的控制器命令使用。其唯一目的是将其他关键字添加到 URL 中。

在下面的映射文件示例中,URL 将与 /IBMProduct_ThinkpadT40_10251_10001_10001_-1 类似。URL 映射将第一个值映射到 keyword=ThinkpadT40,而 WC 控制器命令只是忽略该名称值对。其缺点是,它不会从 URL 中删除 productId,因此该 URL 变长了。

<pathInfo_mapping name="IBMProduct" requestName="ProductDisplay">
   <parameter name="keyword" />
   <parameter name="productId" />
   <parameter name="storeId" />
   <parameter name="catalogId" />
   <parameter name="langId" />
</pathInfo_mapping>
示例 4
示例 4

修复包含特殊字符的 URL

当从 URL 中提取信息时,参数值会在多种情况下使用。在某些情况下,这些参数可能会含有诸如“/” 或“\”之类的特殊字符,例如,Web 服务器可能会将这些特殊字符误解为新目录。如果这些实际字符被误用,则会出现诸如“404 Not Found”之类的错误。若要说明这些情况,则必须对这些特殊字符进行编码,以使 Web 服务器能够正确地解释它们。

正斜杠“/”的 URL 编码字符是 %2F。对于反斜杠“\”,其 URL 编码字符则是 %5C。

为使 Web 服务器能够理解这些特殊斜杠,将在 IHS 2.0 中引入名为 AllowEncodedSlashes 的新指令。该指令在缺省情况下处于关闭状态,您必须在 httpd.conf 文件内设置该指令。有关该指令的更多信息,请参阅 apache.org 站点上的 AllowEncodedSlashes Directive

注意:IHS 的较低版本并不支持 AllowEncodedSlashes 指令。

一旦指令准备就绪,就可以创建与下面的 URL 类似的静态链接(在本示例中,分隔符为“|”):

|IBMCategory|Hardware%2FSoftware|Laptop|10001|1

包含编码字符的对应参数将如下所示:

Hardware/Software

对于诸如“和”号 (&) 或冒号 (:) 之类的其他特殊字符,您可以使用编码版本(例如,分别是 %26 和 %3A),而不用对 httpd.conf 进行任何额外的修改。

缩短 URL 中的参数

静态链接常常包含多个参数值,其中有一些会在存储的每个链接中重复出现,如 storeId 或 langId。当这些参数与其他若干参数一起添加时,URL 会变得很长。若要说明这些长的 URL,则可以使用 URL_Mapper_File 来指定 URL 中的每个参数的缺省值。因此,如果您未指定 URL 中的某个值(两个分隔符之间没有任何数据),则会使用 URL_Mapper_File 中定义的缺省值。然而,如果您需要支持多个存储或多种语言,您可以只针对其中一个使用缺省值,而不针对所有的存储和语言。

若要配置缺省值,您可以在必要时为 WC_installdir/xml/mapping/newUrlmapper.xml 文件中的“parameter”元素使用可选的“default”属性。以下示例阐释了这种情况:

<parameter name="storeId" default="10001" />

通过使用缺省属性,您可以将所讨论的参数保留为空,缺省值将会自动分配到该参数。

当为“storeId”指定缺省值时,下列示例将会使用 TopCategoriesDisplay。

不进行 URL 映射:

TopCategoriesDisplay?storeId=10001&catalogId=10051&langId=-1

在不使用“default”参数的情况下进行 URL 映射:

TopCategoriesDisplay_10001_10051_-1

在使用“toreId”参数的“default”参数的情况下进行 URL 映射:

TopCategoriesDisplay__10051_-1

注意:当使用缺省参数时,将会存在两个紧靠在一起的分隔符(在此示例中使用了下划线),因为没有必要指定“storeId”参数。

缩短 URL 中的上下文根部分

URL 中始终会重复出现的另一部分是上下文根或 Web 路径。WebSphere Commerce 的缺省存储 URL 与以下所示类似:

http://<hostname>/webapp/wcs/stores/servlet/Command?NVP1&NVP2&NVPn

在此 URL 中,您可以进一步缩短以下两部分:webapp/wcs/stores 和 servlet。

您可以使用更短或更有意义的关键字替换 URL 的这两部分,例如:

http://<hostname>/MyStore/<keyword>/Command|NVP1|NVP2|NVPn

若要将此路径更改为更短的版本或其他一些更具搜索引擎友好的自定义路径,请参阅 Technote: Changing a WebSphere Commerce store Web path or context root

使用静态 URL 提供 JSP

通常,对于动态构造的页面,这些页面的 URL 会在名称值对上包含诸如 ? 和 & 之类的停止字符。这些页面基于输入名称值对动态构造而成。搜索引擎具有爬网程序,这些爬网程序可抓取 Web 并针对找到的页面建立索引,但这些爬网程序通常会限制建立索引的动态 URL 的数量。

若要说明这种情况,则可以使用 WebSphere Commerce 提供的功能之一:URL 映射。有关此内容的更多信息,请参阅WebSphere Commerce 信息中心:搜索引擎优化。您可以在 JSP 内使用静态的 URL,而不使用典型的动态 URL。

以下是典型的动态 URL 的示例:

webapp/wcs/stores/servlet/ProductDisplay?storeId=10001&catalogId=10001&productId=10032
&langId=-1

以下是静态 URL 的示例:

webapp/wcs/stores/servlet/product_10001_10001_10032_-1

使用静态 URL 新建的 JSP

创建网站时,首先确定将由爬网程序建立索引的页面,这一点很重要。这些页面通常是目录显示和产品显示页面。对于指向这些页面的链接,如果要为搜索引擎优化 JSP,则 URL 将会是静态的。

假设 JSP 是使用 JSTL 进行编写的,以下是如何为 JSP 创建静态 URL 的示例:

<c:url var="CategoryDisplayURL"    value="
Category_${WCParam.storeId}_${WCParam.catalogId}_${category.categoryId}" >
</c:url>

假设 JSP 是在 Java 代码中编写的,以下是针对 JSP 的静态 URL 的示例:

Category_<%=catalogId%>_<%=storeId%>_<%=category.getCategoryId()%>

转换现有的 JSP 以使用静态 URL

如果您已经具有使用动态 URL 的现有 JSP,则 WebSphere Commerce 会提供有助于将 JSP 中的链接从动态 URL 转换为静态 URL 的工具。将会根据 JSP 是在 JSTL 中编写,还是在 Java 代码中编写而使用不同的工具。对于使用 JSTL 的 JSP,将会使用 URL 映射 Java 应用程序 (URLMappingConvertor)。而对于使用 Java 代码的 JSP,则会使用 URL 映射 Perl 脚本 (urlmapping.pl)。

针对使用 JSTL 的 JSP 文件使用 URLMappingConvertor

在 WebSphere Commerce 6.0 中,将会提供基于 URL 映射文件的定义而转换 <c:url> 标记语法的工具。例如,该工具会将以下内容:

<c:url var="TopCategoriesDisplayURL" value="TopCategoriesDisplay">
   <c:param name="storeId" value="${WCParam.storeId}" />
   <c:param name="catalogId" value="${WCParam.catalogId}" />
   <c:param name="langId" value="${langId}" />
</c:url>

转换为:

<c:url var="TopCategoriesDisplayURL"
value="topcategories_${WCParam.storeId}_${WCParam.catalogId}_${langId}">
</c:url>

该工具是 Java 可执行文件,可以在命令提示符窗口或 Unix 终端中运行。

有关如何使用 URLMappingConvertor 的更详细的信息,请参阅WebSphere 信息中心:Optimizing your site for search engines

针对使用 Java 代码的 JSP 文件使用 urlmapping.pl

该工具基于 URL 映射文件的定义而转换 a:href URL 语法。例如,该工具将以下内容:

CategoryDisplay?catalogId=<%=catalogId%>&categoryId=<%=category.getCategoryId()%>
&storeId=<%=storeId%>

转换为:

Category_<%=catalogId%>_<%=storeId%>_<%=category.getCategoryId()%>

该工具是一个 Perl 脚本。您需要安装 Perl 应用程序才能在您的计算机上执行该工具。

有关如何使用 urlmapping.pl 的更详细的信息,请参阅WebSphere 信息中心:Optimizing your site for search engines

用于实现站点地图的最佳实践

站点地图具有以下功能:

  • 为搜索引擎爬网程序提供入口点,以使爬网程序轻松地跟踪您的 Web 页面内的链接。
  • 有助于为爬网程序优化站点的整个结构,通过提供备用的 Web 页面组,从而使爬网程序能够快速地访问大量的嵌入式页面并针对这些页面建立索引。站点地图便于对站点进行深度搜索。

高效站点地图将会构建为站点中不同页面的简要概述,并且会在尽可能少的页面中为爬网程序呈现大量的链接的列表。然而,请记住,站点地图仍然是单个 HTML 页面并且应保持相对较小的页面大小。视您的站点所具有的目录和产品的数量而定,列出目录的最前三个级别即可。首先,将 robots.txt 指向站点地图目录。然后,将该文件与 URL 映射一起使用,以便将页面转换为静态 URL。此方法会创建一个高效的站点地图,以供搜索引擎爬网程序在您的整个站点中遍历尽可能多的 URL 并针对这些 URL 建立索引。

为使用静态 URL 的页面设置动态缓存

从性能角度来看,站点有必要对浏览该站点的客户做出快速的响应。应该对所有客户都经常查看的公共动态 Web 页面(如 TopCategoriesDisplay、CategoryDisplay 和 ProductDisplay)进行缓存,以便尽可能快速地提供这些内容。其中的一个选项是使用动态缓存服务,WebSphere Application Server 中内置了该服务,用于提供动态内容和缓存数据。还使用该 dynacache 服务对使用 WebSphere Commerce URL 映射生成的静态 URL 进行缓存。

使用 URL_Mapper_File 将静态 URL 转换为动态 URL 之后,才由 dynacache 服务对其进行处理。因此,dynacache 服务并不知道初始化链接是静态的还是动态的,该服务只是处理请求。

如果您正在使用站点地图,则需要对站点地图页面进行单独缓存,其方法是针对与将具有静态链接的 JSP 页面相关联的每个命令,使用 subDir 的 ID 将组件元素添加到您的站点的 cachespec.xml 文件中。例如,cachespec.xml 文件中与 TopCategoriesDisplay 命令有关的部分与以下内容类似:

<!-- TopCategoriesDisplay?storeId=<storeId>&catalogId=<catalogId> -->
<cache-id>
<component id="" type="pathinfo">
       <required>true</required>
       <value>/TopCategoriesDisplay</value>
</component>
<component id="storeId" type="parameter">
       <required>true</required>
</component>
<component id="catalogId" type="parameter">
       <required>true</required>
</component>
...
<component id="subDir" type="parameter">
       <required>false</required>
</component><component id="DC_lang" type="attribute">
    <required>true</required>
</component>
<component id="DC_curr" type="attribute">
    <required>true</required>
</component>
...
</cache-id>

注意:如果您正在使用站点地图,请使用 pathInfo_mappings 元素的 subDirectory 属性指定站点地图子目录的位置。例如:

<pathInfo_mappings separator="_" subDirectory="SiteMap">

此操作将导致 WebSphere Commerce 将 subDir=SiteMap 名称值对(该名称值对表明站点地图 JSP 页面位于 SiteMap 目录中)添加到与当前请求相关联的一组属性中。

还必须注意,如果您正在维护两组单独的 JSP:一组位于原始位置(使用动态 URL 的 JSP),另一组位于站点地图位置(使用静态 URL 的 JSP),则可能会生成两组缓存项:一组用于动态 JSP,另一组用于静态 JSP。因此,在为您的环境优化缓存大小时,请为缓存项分配足够的内存和磁盘空间。

结束语

本文描述了有关如何针对您的 WebSphere Commerce 站点进一步改善搜索引擎优化结果的 WebSphere Commerce 的多种功能和技术。本文涉及到如何配置使用静态 URL 的 JSP、如何自定义 URL 映射并直接将更有效的关键字嵌入到 URL 中、如何修复 URL 中特殊字符的问题、如何通过缩短 URL 来进一步增强 SEO,以及如何为静态 URL 设置动态缓存。

对于搜索引擎优化,请考虑可确保针对尽可能多的目录页面建立索引的自底向上的方法。您可以将本文中描述的技术结合使用以实现此方法。一旦在搜索引擎中列出这些页面,您就可以通过在重要位置中填充关键字来改善这些页面的排名。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=187973
ArticleTitle=针对您的 WebSphere Commerce 站点改善搜索引擎优化结果
publish-date=01112007