PHP中的URL编码问题:header(‘Refresh‘)中文乱码Not Found、CURL空格Not Found

代码

//header函数的Refresh的url含有中文 乱码导致NotFound 的问题
// url=../mysql news案例/select.php
//解决:对中文编码 rawurlencode
header('Refresh:3;url=../mysql news'.rawurlencode('案例').'/select.php');
//或 urlencode
header('Refresh:3;url=../mysql news'.urlencode('案例').'/select.php');
//CURL的url含有空格 导致NotFound 的问题
// url=localhost/mysql news案例/select.php
//解决:对空格编码rawurlencode
curl_setopt($ch,CURLOPT_URL,'localhost/mysql'.rawurlencode(' ').'news案例/20select.php');
//或 直接使用%20
curl_setopt($ch,CURLOPT_URL,'localhost/mysql%20news案例/20select.php');

问题

header函数的延时重定向Refresh 的url含有中文,(非ASCII字符)传递到浏览器会乱码,浏览器再原封不动请求服务器时,服务器会识别不了:Not Found

CURL的url含有空格 导致NotFound

解决方法

对于Refresh的问题,采用对中文部分单独进行url编码,然后拼接即可解决。可以用urlencode()rawurlencode()函数

对于CURL的问题,要用rawurlencode()函数对除/之外的内容进行编码,或者直接把空格替换为空格的url编码:%20

这两个问题,或者其他类似会出现的问题,均可以统一处理:对所有除/外的内容使用rawurlencode()函数编码解决


注意:不可对整串url进行编码

服务器可以直接识别ASCII字符,但不能完全识别ASCII字符的url编码,所以一般请求时只对ASCII码表以外的字符编码。

urlencode()rawurlencode()可以对ASCII字符也进行编码,如果对ASCII字符进行了编码,会导致服务器不识别造成访问失败

举例说明

1. 路径符号:/ 的编码 服务器不可识别

路径符号/的URL编码为%2f,对下面几个Apache和Nginx搭建的网站,将url的/替换为%2f进行测试

Apache:
	https://itbyc.com/server/16036.html
	https://demo.yzmcms.com/xiazai/16.html
Nginx:
	http://mirrors.aliyun.com/centos/7/isos/x86_64/
	http://mirrors.163.com/centos/7/isos/x86_64/
//我区分服务器是Apache还是Nginx的根据:
	//只要是替换/为%2f后,出现Not Found页面,有Apache Server字眼,一定是Apache服务器
	//Nginx则访问静态资源目录网站(阿里云和163的镜像网站等),根据样式能判断出是Nginx的静态资源目录样式
//并且发现,所有不能识别%2f的网站,错误页面全都有ApacheServer

结果表名,Apache不能正确解析为 / ,而nginx可以。(个人试验,结论可能并不准确,但可以粗略解惑)

2. 空格的urlencode编码 不可识别

urlencode对空格编码为+,rawurlencode对空格编码为%20

(根据经验,几乎所有的)服务器只能识别%20的空格以及未编码的空格(空格属于ASCII码可以直接识别),而不能识别+的空格。


什么是URL编码

对于ASCII字符,将其ASCII值转换为16进制,然后在其前面放置转义字符%,置入 URL 中的相应位置

对于非 ASCII 字符, 将其对应的UTF8转为16进制,然后每个字节前加%
举例:的UTF8转为16进制为\xe6\x98\xa5\x表示十六进制,十六进制两位为1个字节,UTF8中一个汉字占3字节,在每个字节前加 %%E6%98%A5


😁欢迎加入QQ群交流: [游戏-Web-开发技术栈 ☄️] '300567032’
点击下方图标一键加入!
游戏-Web-开发技术栈 ☄


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值