设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

每个 Web 开发者都应该知道的关于 URL 编码的知识

2013-6-26 10:03| 发布者: 红黑魂| 查看: 3382| 评论: 0|来自: 开源中国编译

摘要: 本文首先阐述了人们关于统一资源定位符(URL)编码的普遍的误读,其后通过阐明HTTP场景下的URL encoding来引出我们经常遇到的问题及其解决方案。本文并不特定于某类编程语言,我们在Java环境下阐释问题,最后从Web应 ...

确保你的URL-rewrite过滤器正确的处理网址

Url 重写过滤器是一个重写过滤器,我们在seam中用于转化漂亮的地址去应用依赖的网址。

例如,我们用它把http://beta.visiblelogistics.com/view/resource/FOO/bar转化为http://beta.visiblelogistics.com/resources/details.seam?owner=FOO&name=bar

很明显,这个过程包含了一些字符串从一个地址到另一个地址,这意味着我们要从路径部分解码并且把它重新

编码为另一个查询值部分。

我们起初的规则,如下所示:

1<urlrewrite decode-using="utf-8">
2 <rule>
3  <from>^/view/resource/(.*)/(.*)$from>
4  <to encode="false">/resources/details.seam?owner=$1&name=$2to>
5 rule>
6urlrewrite>

从这我们可以看到在重写过滤器中只有两种方法处理网址重写:每一个的网址先被解码去做规则匹配(模式),

或者它不可用,所有规则去处理解码。在我们看来后者是比较好的选择,特别是当你要移动网址部分周围,或者

想去包含URL解码路径分隔符的匹配路径部分时候。


在替换模式中(模式)你可以使用内建的函数escape(String)和unescape(String)处理网站转码和解码。

在撰写这个文章的时候,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)


我们现在可以这样写,几乎不会有错误

1<urlrewrite decode-using="null">
2 <rule>
3  <from>^/view/resource/(.*)/(.*)$from>
4  <-- Line breaks inserted for readability -->
5  <to encode="false">/resources/details.seam
6                     ?owner=${escape:${unescapePath:$1}}
7                     &name=${escape:${unescapePath:$2}}to>
8 rule>
9urlrewrite>

唯一可能出问题的地方是由于我们的补丁还不能解决以下的问题:

  • 内建的escaping/unescaping函数应能只能编码,这已经做为下一个补丁(已经做完了),或者能从http
  • 请求来确定(还不支持),
  • oldescape(String)和unescape(String)内建函数被保留了,并且仍然调用java.net.URLDecoder,而这
  • 个包在由于没有解决"&"和"="的问题,所以仍然有问题,
  • 我需要增加更多的局部特定的编码和解码函数,
  • 我们需要增加一个方法去鉴别per-rule解码行为,对照全局在

我们一有时间,我们就会发布第二个补丁。


正确使用Apache mod-rewrite

  Apache 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



酷毙
1

雷人

鲜花

鸡蛋

漂亮

刚表态过的朋友 (1 人)

  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部