确保你的URL-rewrite过滤器正确的处理网址Url 重写过滤器是一个重写过滤器,我们在seam中用于转化漂亮的地址去应用依赖的网址。 例如,我们用它把http://beta.visiblelogistics.com/view/resource/FOO/bar转化为http://beta.visiblelogistics.com/resources/details.seam?owner=FOO&name=bar。 很明显,这个过程包含了一些字符串从一个地址到另一个地址,这意味着我们要从路径部分解码并且把它重新 编码为另一个查询值部分。 我们起初的规则,如下所示:
从这我们可以看到在重写过滤器中只有两种方法处理网址重写:每一个的网址先被解码去做规则匹配( 在替换模式中( 在撰写这个文章的时候,Url Rewrite Filter Beta 3.2有一些bugs,限制住我们提高URL-correctness: 网址解码使用java.net.URLDecoder(这是错误的), escape(String)和unescape(String)内建函数使用java.net.URLDecoder和java.net.URLEncoder (不够强大,只能用于这个查询字串,所有的"&"或者"="不被转码)。 We therefore made a big patch fixing a few issues like URL decoding, and adding the inline functionsescapePathSegment(String)andunescapePathSegment(String). 我们因此做了一个大修正补丁,用于修正诸如网址解码问题以及增加内建函建escapePathSegment(String) 和 unescapePathSegment(String) 我们现在可以这样写,几乎不会有错误
唯一可能出问题的地方是由于我们的补丁还不能解决以下的问题:
我们一有时间,我们就会发布第二个补丁。 正确使用Apache mod-rewriteApache mod-rewrite是一个Apache Web服务器的网址重写模块。例如用它来把 http://beta.visiblelogistics.com/foo 的流量代理到http://our-internal-server:8080/vl/foo。 这是最后的要修正的事情,就像是Url Rewrite Filter,他默认解码网址给我们,并且从新编码重写过得网址给 我们,这其实上是错误的,因为"解码的网址不能被重新编码"。 有一种方法可以避免这种行为,至少在我们的案例中我们没有转化一个网址部分到另一个网址,例如,我们不需 要解码一个路径部分并且重新编码它到一个查询部分:没有加码也没有重编码。 我们通过THE_REQUEST来网址匹配来完成工作。他是完全的HTTP请求(包括HTTP方法和版本)联合解码。 我们只要取host后面的URL部分,改变host和预设的/v/前缀和tada ...
# This is required if we want to allow URL-encoded slashes a path segment
AllowEncodedSlashes On
# Enable mod-rewrite
RewriteEngine on
# Use THE_REQUEST to not decode the URL, since we are not moving
# any URI part to another part so we do not need to decode/reencode
RewriteCond %{THE_REQUEST} "^[a-zA-Z]+ /(.*) HTTP/\d\.\d$" RewriteRule ^(.*)$ http://our-internal-server:8080/vl/%1 [P,L,NE] 结论我希望阐明一些URL技巧和常见的错误。简而言之,能把它说明白就够了,但这不是一些人想象的那样简单的。 我们展示了java常见的错误和一个web 应用部署的整个过程。现在每个读者都应该是一个URL专家了,并且我 们希望不要在看见相关bugs再出现。请求SUN公司,请为URL encoding/decoding逐项的增加标准支持 英文原文:What every web developer must know about URL encoding |