PHP下URL路径转义的坎坷之路

PHP下URL路径转义的坎坷之路

事故一:

某天,在线上点击下载附件时,浏览器报400HTTP异常,这时候一顿复现操作,发现是因为用户在给文件命名时包含有特殊字符,这时候才发现接口返回的路径无法被HTTP正确编码解析,需使用PHP函数对文件名进行编码。

解决方案:

于是使用了PHP自带的函数 urldecode()对文件名称进行解码,然而此时告一段落

事故二:

但是发现过没多久,原先的附件可以进行下载,但是其他附件无法进行下载,直接报404路径不存在了,这时候又裂开了,这是我敢肯定,文件路径包裹有特殊字符,而进行编码时可能存在编码错误,才会导致此事故发生,对比编码路径,最后发现URL的解码中,空格被转换成了 ,导致客户端识别不到空格,报文件路径不存在。但这是存在疑惑,自己使用的是PHP函数库的编码和解码方法,这是百度了才知道 urldecode()是会将 转义成 +另一个特殊字符

这时,直觉告诉我肯定不是谁对谁错,肯定是标准不同或采用的语言差异等导致的,以下是引用别人的介绍URL中关于空格的编码转换成+或转换成%20的问题

一个URL的基本组成部分包括协议(scheme),域名,端口号,路径和查询字符串(路径参数和锚点标记就暂不考虑了)。路径和查询字符串之间用问号?分离。例如http://www.example.com/index?param=1,路径为index,查询字符串(Query String)为param=1。URL中关于空格的编码正是与空格所在位置相关:空格被编码成加号+的情况只会在查询字符串部分出现,而被编码成%20则可以出现在路径和查询字符串中。
造成这种混乱局面的原因在于:W3C标准规定,当Content-Type为application/x-www-form-urlencoded时,URL中查询参数名和参数值中空格要用加号+替代,所以几乎所有使用该规范的浏览器在表单提交后,URL查询参数中空格都会被编成加号+。而在另一份规范(RFC 2396,定义URI)里, URI里的保留字符都需转义成%HH格式(Section 3.4 Query Component),因此空格会被编码成%20,加号+本身也作为保留字而被编成%2B,对于某些遵循RFC 2396标准的应用来说,它可能不接受查询字符串中出现加号+,认为它是非法字符。所以一个安全的举措是URL中统一使用%20来编码空格字符。

最终解决方案

使用PHP函数库 awurlencode()来进行编码即可~此函数遵循RFC 3986标准,空格会被转为%20

PHP函数库 urlencode()rawurlencode()的区别:urlencode() 将空格编码为加号“+”,rawurlencode()将空格编码为加号“%20”。

同时,对于此函数转码的url,普通的urldecode是不能正确解码的,所以官方也提供了rawurldecode()函数来对转码后的结果解码,使用此函数时,不用担心版本兼容问题,因为它在PHP4就已经支持了~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值