1

我正在使用一些简单的 Jetty 重写规则

<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-Control标头。但是,如果我重新排序规则以使标头规则高于正则表达式规则,则Cache-Control标头对于/fake-uri/index.html.

似乎顺序在这里很重要,但我正在尝试锻炼正在发生的事情。根据文档

HeaderPatternRule - 添加/修改 HTTP 标头作为响应

我不确定默认值是什么,但我试过了

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

在处理程序上。

它似乎没有改变任何东西,但我认为如果请求URI 被重写,那么 URI 重写规则出现在与适用于输出头的头重写相关的位置并不重要。即使rewriteRequestURI设置为true,标题规则也必须排在第二位才能达到预期的效果。那么,当我设置rewriteRequestURI时,为什么顺序很重要?

4

1 回答 1

2

处理顺序是自上而下的,规则引擎继续处理规则,直到某个规则终止处理。

即使 HeaderPatternRule 更新了响应,它也匹配请求上的 URL。这就是为什么仅在顺序是这样的情况下才添加 Cache-Control 的原因,即首先重写 URL 以匹配第二个规则。

您关于以下参数的问题的另一部分:

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

并不真正适用于您正在尝试做的事情。rewriteRequestURI 参数告诉重写引擎也HttpServletRequest.getRequestURI()像你说的那样更新,但这不会影响规则引擎,只会影响 Servlet 应用程序如何受到重写的影响。

规则引擎中最重要的是排序,如果有任何规则使用以下语句终止处理:

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

这将停止规则引擎。

一个令人困惑的注意事项是,如果您使用重定向规则而不是重写规则。这将触发规则引擎在重定向上再次执行。这样您就可以从头开始重新处理规则(并创建无限循环)

于 2013-10-29T20:28:31.700 回答