如何为 Undertow / JBoss 7.2 EAP 重写 RewriteValve?

Posted

技术标签:

【中文标题】如何为 Undertow / JBoss 7.2 EAP 重写 RewriteValve?【英文标题】:How to rewrite a RewriteValve for Undertow / JBoss 7.2 EAP? 【发布时间】:2020-11-04 00:03:06 【问题描述】:

我正在从 JBoss 6.4.3 迁移到 JBoss 7.2,并在部署期间看到 Valves are no longer supported 警告。这来自jboss-web.xml 文件,其中包含:

<valve>
    <class-name>org.jboss.web.rewrite.RewriteValve</class-name>
</valve>

...以及对应的rewrite.properties 文件:

RewriteCond %HTTP:X-Forwarded-Proto http
RewriteRule .* https://%HTTP_HOST%REQUEST_URI [R,L]

谁能建议如何为 Undertow 重写这个(不是双关语)?

【问题讨论】:

这不是一个真正的正则表达式问题。重写规则只是将所有 http 请求发送到 https。 我现在已经替换了正则表达式标签。 【参考方案1】:

您可以在 Undertow 子系统中创建一个rewrite filter,然后在配置文件(standalone.xmldomain.xml)中的服务器主机中引用它 -取决于您启动应用程序服务器的模式)。

我能想到两个可能对你有帮助的选择:

    使用JBoss Application Server Client(应放在path/to/jboss-7.2/bin/

    使用自定义名称 redirect-http-to-https 创建重写过滤器:
    ./jboss-cli.sh --connect --command="/subsystem=undertow/configuration=filter/rewrite=redirect-http-to-https:add(redirect=\"true\",target=\"https://%LOCAL_SERVER_NAME%REQUEST_URL\")"
    
    使用/引用过滤器redirect-http-to-https
    ./jboss-cli.sh --connect --command="/subsystem=undertow/server=default-server/host=default-host/filter-ref=redirect-http-to-https:add(predicate=\"equals(%p,80)\")"
    

    手动编辑相应的配置文件(例如standalone.xml

<subsystem xmlns="urn:jboss:domain:undertow:11.0" default-server="default-server" [...]>
            <buffer-cache name="default"/>
    <server name="default-server">
        [...]
        <host name="default-host" alias="localhost">
            <filter-ref name="redirect-http-to-https" predicate="equals(%p,80)"/>
        </host>
    </server>
    [...]
    <filters>
        <rewrite name="redirect-http-to-https" target="https://%LOCAL_SERVER_NAME%REQUEST_URL" redirect="true"/>
    </filters>
</subsystem>

注意:有关 Undertow 交换属性(例如 LOCAL_SERVER_NAME),请参阅 Undertow documentation。此外,filter-ref 中的 predicate=\"equals(%p,80)\" 部分检查请求的端口(@98​​7654335@ -> 只是另一个 Undertow 交换属性),如果它等于 80,那么它会触发我们的重定向过滤器 redirect-http-to-https - 您可以更改端口80 根据您的需要。

【讨论】:

感谢您的回答。你知道在 jboss-web.xml 文件中是否有这样做的方法吗? @SteveChambers 抱歉,我之前从未与jboss-web.xml 合作过。如果你有可能使用像 nginx 这样的反向代理服务器,我宁愿使用它而不是重新配置 Undertow。 @SteveChambers 如果我使用任何交换属性,我的端口不会更改(保持 8080)。它可以在没有的情况下工作,例如:target="https://localhost:8443/myapp"。任何想法?我尝试了多种组合,但一个示例是https://%LOCAL_SERVER_NAME:8443%REQUEST_URL

以上是关于如何为 Undertow / JBoss 7.2 EAP 重写 RewriteValve?的主要内容,如果未能解决你的问题,请参考以下文章

Undertow (JBoss 7) 在重定向时破坏/重新编码 URL 编码的参数

如何使用undertow将非www URL重定向到jboss中的www URL

Keycloak/Undertow/JBoss-CLI - 从环境变量中设置“web-context”

Jboss7:Undertow Spring Boot 抛出 404

Wildfly Undertow 文件 Mimetypes

注册新的undertow SessionManager