Search code examples
url-rewritingjettyjetty-9

How to configure the Jetty URL rewrite handler?


I'm testing the jetty 9 rewrite feature, trying to rewrite the following URL:

http://localhost/rewrite to http://localhost/test.html

Here is my configuration:

<Configure id="Server" class="org.eclipse.jetty.server.Server">

    <New id="Rewrite" class="org.eclipse.jetty.rewrite.handler.RewriteHandler">
      <Set name="handler"><Ref refid="oldhandler"/></Set>
      <Set name="rewriteRequestURI"><Property name="jetty.rewrite.rewriteRequestURI" deprecated="rewrite.rewriteRequestURI" default="true"/></Set>
      <Set name="rewritePathInfo"><Property name="jetty.rewrite.rewritePathInfo" deprecated="rewrite.rewritePathInfo" default="false"/></Set>
      <Set name="originalPathAttribute"><Property name="jetty.rewrite.originalPathAttribute" deprecated="rewrite.originalPathAttribute" default="requestedPath"/></Set>

      <!-- Set DispatcherTypes  -->
      <Set name="dispatcherTypes">
        <Array type="javax.servlet.DispatcherType">
          <Item><Call class="javax.servlet.DispatcherType" name="valueOf"><Arg>REQUEST</Arg></Call></Item>
          <Item><Call class="javax.servlet.DispatcherType" name="valueOf"><Arg>ASYNC</Arg></Call></Item>
        </Array>
      </Set>

      <Call name="addRule">
        <Arg>
          <New class="org.eclipse.jetty.rewrite.handler.RewritePatternRule">
            <Set name="pattern">/rewrite</Set>
            <Set name="replacement">/test.html</Set>
          </New>
        </Arg>
      </Call>
    </New>

    ...

</Configure>

Opening http://127.0.0.1/test.html in the browser works but http://localhost/rewrite gives me an 404 error.
Did I configure it wrong?


Solution

  • I had to execute:

    java -jar start.jar --add-to-startd=rewrite
    

    Modify the jetty-rewrite.xml instead of the jetty.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
    <Configure id="Server" class="org.eclipse.jetty.server.Server">
       <!-- =========================================================== -->
       <!-- Configure rewrite handler                                   -->
       <!-- =========================================================== -->
       <Call name="insertHandler">
          <Arg>
             <New class="org.eclipse.jetty.rewrite.handler.RewriteHandler">
                <Set name="rewriteRequestURI">
                   <Property name="jetty.rewrite.rewriteRequestURI" deprecated="rewrite.rewriteRequestURI" default="true" />
                </Set>
                <Set name="rewritePathInfo">
                   <Property name="jetty.rewrite.rewritePathInfo" deprecated="rewrite.rewritePathInfo" default="false" />
                </Set>
                <Set name="originalPathAttribute">
                   <Property name="jetty.rewrite.originalPathAttribute" deprecated="rewrite.originalPathAttribute" default="requestedPath" />
                </Set>
                <!-- Set DispatcherTypes  -->
                <Set name="dispatcherTypes">
                   <Array type="javax.servlet.DispatcherType">
                      <Item>
                         <Call class="javax.servlet.DispatcherType" name="valueOf">
                            <Arg>REQUEST</Arg>
                         </Call>
                      </Item>
                      <Item>
                         <Call class="javax.servlet.DispatcherType" name="valueOf">
                            <Arg>ASYNC</Arg>
                         </Call>
                      </Item>
                   </Array>
                </Set>
                <Get id="Rewrite" name="ruleContainer" />
                <!-- see rewrite-compactpath.xml for example how to add a rule -->
                <Call name="addRule">
                   <Arg>
                      <New class="org.eclipse.jetty.rewrite.handler.RewritePatternRule">
                         <Set name="pattern">/rewrite/test.html</Set>
                         <Set name="replacement">/test/test.html</Set>
                      </New>
                   </Arg>
                </Call>
             </New>
          </Arg>
       </Call>
    </Configure>