如何为 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.xml 或 domain.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)\"
部分检查请求的端口(@987654335@ -> 只是另一个 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”