代码
//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’
点击下方图标一键加入!