2013-10-28 46 views
1

我一些簡單的碼頭重寫規則令碼頭的重寫規則

<Configure id="FileServer" class="org.eclipse.jetty.server.Server"> 
    <Get id="oldhandler" name="handler"/> 
    <Set name="handler"> 
     <New id="Rewrite" class="org.eclipse.jetty.rewrite.handler.RewriteHandler"> 
      <Set name="handler"><Ref id="oldhandler"/></Set> 

      <Call name="addRule"> 
       <Arg> 
        <New class="org.eclipse.jetty.rewrite.handler.RewriteRegexRule"> 
        <Set name="regex">/fake-uri/(.*)</Set> 
        <Set name="replacement">/real-uri/$1</Set> 
        </New> 
       </Arg> 
      </Call> 

      <Call name="addRule"> 
       <Arg> 
        <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule"> 
         <Set name="pattern">/real-uri/*</Set> 
         <Set name="name">Cache-Control</Set> 
         <Set name="value">no-cache,no-store</Set> 
        </New> 
       </Arg> 
      </Call> 

     </New> 
    </Set> 
</Configure> 

如果我在瀏覽器請求/fake-uri/index.html工作,響應包含哪些會被/real-uri/index.html送達應用的cache控制標題。但是,如果我重新排列規則以使標題規則高於正則表達式規則,則對/fake-uri/index.html的請求將不存在緩存控制標頭。

似乎順序在這裏很重要,但我正在努力鍛鍊發生了什麼事情。據the doc

HeaderPatternRule - 添加/修改HTTP頭響應

我不確定默認的是什麼,但我一直在試圖處理

<Set name="rewriteRequestURI">true</Set> 

它似乎並沒有改變什麼,但我想如果要求 URI被改寫,這不會有問題的URI重寫規則出現在相對於它適用於輸出頭重寫哪裏頭。事情甚至rewriteRequestURI設置爲true,標頭規則必須第二個所需的效果。那麼爲什麼訂單重要時,我已經設置rewriteRequestURI

回答

2

處理順序是自上而下的,規則引擎繼續處理規則,直到規則終止處理。

即使HeaderPatternRule更新響應,它也會匹配請求上的URL。這就是爲什麼只有在命令重新寫入URL以匹配第二條規則時纔會添加Cache-Control。

您對以下參數問題的另一部分:

<Set name="rewriteRequestURI">true</Set> 

並不真正適用於你正在嘗試做的。 rewriteRequestURI參數告訴重寫引擎也像你說的那樣更新HttpServletRequest.getRequestURI(),但是這不會影響規則引擎,而只會影響Servlet應用程序如何受到重寫的影響。

所有這一切在規則引擎中重要的是訂購,如果任何規則終止與該語句的處理:

<Set name="terminating">true</Set> 

,將停止該規則引擎。

令人困惑的是如果使用重定向規則而不是重寫規則。這將觸發規則引擎在重定向上再次執行。這樣,您可以重新處理規則(並創建無限循環)

+1

公平地說,重定向規則會導致新的請求,這就是規則再次運行的核心原因。 –

+0

沒錯,只是爲了強調重寫規則沒有,這可能會讓人困惑,因爲它們在配置中看起來非常相似。 – Idlewood