SEO優化:URLRewrite詳解

 

1.       apache中配置

2.       URLRewrite(詳細:重點是UrlRewrite+Struts2)

1)  http://tuckey.org/urlrewrite/ 下載最新的jar包下來,現時我用的是Url Rewrite3.2

2)  urlrewrite.xml拷貝到WEB-INF目錄下

3)  web.xml中配置其攔截器。注意,攔截器應放在strutsFilter的前面。

 

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5"

    xmlns="http://java.sun.com/xml/ns/javaee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

   

<filter>

       <filter-name>encodingFilter</filter-name>

       <filter-class>

           org.springframework.web.filter.CharacterEncodingFilter

       </filter-class>

       <init-param>

           <param-name>encoding</param-name>

           <param-value>UTF-8</param-value>

       </init-param>

       <init-param>

           <param-name>forceEncoding</param-name>

           <param-value>true</param-value>

       </init-param>

    </filter>

   

    <filter-mapping>

       <filter-name>encodingFilter</filter-name>

       <url-pattern>/*</url-pattern>

    </filter-mapping>

    <filter>

            <filter-name>UrlRewriteFilter</filter-name>

            <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>

            <init-param>

                <param-name>logLevel</param-name>

                <param-value>WARN</param-value>

            </init-param>

        </filter>

        <filter-mapping>

            <filter-name>UrlRewriteFilter</filter-name>

            <url-pattern>/*</url-pattern>

            <dispatcher>REQUEST </dispatcher> 

            <dispatcher>FORWARD </dispatcher> 

        </filter-mapping>

          

<filter>

    <filter-name>struts2</filter-name>

    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

<filter-mapping>

    <filter-name>struts2</filter-name>

    <url-pattern>*.action</url-pattern>

     <dispatcher>REQUEST </dispatcher> 

     <dispatcher>FORWARD </dispatcher> 

</filter-mapping>

<filter-mapping>

    <filter-name>struts2</filter-name>

    <url-pattern>*.jsp</url-pattern>

</filter-mapping>

</web-app>

 

其中,<dispatcher>REQUEST </dispatcher><dispatcher>FORWARD </dispatcher>  主要說明該攔截器攔截的請求包括客戶端的請求和從服務器端forward的請求。在很多的網文中,都提到struts2<url-pattern>/*</url-pattern> 我試過,這樣是會報內存溢出異常的。上述的是2.16的版本的配置。

以下是urlrewrite.xml的配置

<rule>

      <from>/test.dhtml</from>

      <to type="forward">test.action</to>

    </rule>

   <rule>

    <from>^/([a-zA-Z]+)/save/id/([a-zA-Z0-9]*).dhtml</from>

    <to type="forward">$1!save.action?id=$2</to>

    </rule>

    <rule>

    <from>^/([a-zA-z]+)/([a-zA-Z0-9]*).dhtml</from>

    <to type="forward">%{context-path}/$1!$2.action</to>

    </rule>

     <rule>

        <from>^/content/([a-zA-Z]+.*).html</from>

        <to type="forward">/WEB-INF/content/login-error.jsp</to>

     </rule>

之前如果在web.xml中設置<dispatcher>的話,則一直都不能forward都對應的action中去。以上 在地址欄中輸入 http://lacalhost:8080/應用名/test.dhtml 就可以映射到test.action中。如果要映射test!save.action可以寫成 test/save.dhtml就可以了。

test-access.jsp的代碼(這裏,我用了Convention的零配置,所以test-access.jsp WEB-INF/content目錄中)

   

       <s:form action="test/save.dhtml" method="POST">

 

           <s:textfield name="msg" label="輸入信息"/>

           <s:token name="token"/>

           <s:submit value="確定" />

       </s:form>

 這裏加入了 token令牌,主要是防止表單重複提交的。

那麼,我們可以將在@Result中的錯誤頁面也可以寫成html的形式了,因爲在上面配置了。

<rule>

        <from>^/content/([a-zA-Z]+.*).html</from>

        <to type="forward">/WEB-INF/content/$1.jsp</to>

     </rule>

將所有的html轉換成.jsp來處理。

那麼,在@Result 我們就可以這樣寫:

@Result(name="invalid.token",location="/content/error.html",type="redirect")})

在重複提交的情況下,URL會轉向到/WEB-INF/content/error.jsp中。

但是上述<s:form action="test/save.dhtml" method="POST">並不是一種好的方式。它在一定程度上依賴了UrlRewrite。我們希望,在<s:form/>中依然寫test!save.action 但是在頁面中顯示的是test/save.dhtml。那麼我們可以用<outBund-rule/>標籤。

此標籤的原理是,頁面通過UrlRewrite過濾器後,這個過濾器會遍歷這個頁面,用設定的正則來替換頁面中的URL。如:

    <outbound-rule>

        <from>/test!save.action</from>

        <to type="redirect">/test/save.dhtml</to>

     </outbound-rule>

這樣,在jsp中寫的<s:form action=”test!save.action”> 而通過編譯後在客戶端中的源碼就可以看到:<form id="test" name="test" action="/strutsTest/test/save.dhtml" method="POST">

到此,還是不能進行映射,我們還要進行對test/save.dhtml進行<role/>映射。

      <rule>

    <from>^/test/save.dhtml</from>

    <to type="forward">test!save.action</to>

    </rule>

總結:UrlRewrite這種方式雖好,但是他在每次匹配一個頁面的時候都會遍歷urlrewrite.xml中的所有<role/> 所以,在用的時候,應該注意,儘量將<role/>的個數做到越少。那就需要儘量寫出更通用的正則表達式。儘量讓代碼規範性。這也是高質量代碼的要求。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章