首页 > 解决方案 > Tomcat Rewrite Valve - 如何在客户端浏览器上保留漂亮的 URL

问题描述

我正在使用 Tomcat Rewrite Valve API,以便我可以将我的 webapp URL 发布为“漂亮的 URL ”。我的问题是,在 URL 重写成功后,浏览器 url 地址并没有保留漂亮的 URL,而是显示到我最初试图隐藏的最终丑陋的 URL,因此违背了使用这个漂亮 API 的目的。我了解 Apache mod_rewrite 模块,浏览器会保留用户在成功重写后输入的漂亮 URL;因此从肉眼中隐藏了细节的 URI 和参数。是否可以使用 Rewrite Valve API 来实现这一点?如何?

配置

  1. 服务器 = Tomcat Apache 9.0.30

  2. [webapp] /META-INF/context.xml

<Context override="true" > <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> </Context>

  1. [webapp] /WEB-INF/rewrite.config

    RewriteRule ^/support/contactUs/?$ ?page=page_supportID&fragment=fragment_contactUsID [NC,L]

用例:用户在他们的浏览器上输入漂亮的 URL:http://example.com/support/contactUs

预期:重写规则应用并打开实际(丑陋的) URL = http://example.com?page=page_supportID&fragment=fragment_contactUsID,用户浏览器仍然显示漂亮的 URL = http://example.com/support/contactUs

实际:应用重写规则并打开实际(丑陋的) URL = http://example.com?page=page_supportID&fragment=fragment_contactUsID。但是,浏览器 url 地址也向用户显示了那个丑陋的 url,而不是保留漂亮的。

标签: tomcaturl-rewriting

解决方案


不可能

但是,我希望我错了!在研究了更多这种行为之后,对于 URL 重写方案,我们可能无法控制客户端浏览器如何使用此 API 处理和在其 url 栏上显示重定向后的 URL。

Tomcat RewriteValve API 已经完成了它应该做的事情 = 通过DEFAULT在重定向 URL 时正确HTTP status code 302返回给客户端。每个Tomcat 文档

如果没有给出代码,将返回 302(FOUND,previous MOVED TEMPORARILY)的 HTTP 响应。

我们可以通过读取网络 HTTP 请求/响应堆栈跟踪来确认。对于这个问题,HTTP 响应 302 是我们期望看到的。每个MDN 文档

HTTP 302 Found ... 浏览器重定向到此页面,但搜索引擎不更新其指向资源的链接 ... 即使规范要求在执行重定向时不更改方法(和正文),而不是所有用户代理都符合这里 - 你仍然可以在那里找到这种类型的错误软件。

哎呀!


推荐阅读