访问编码后的中文URL返回404错误的解决方法


Posted in PHP onAugust 20, 2014

昨天做一个项目,其中有一个需求是每一张图片对应一小段文字对图片的说明,普通的做法是新建一个表然后把图片名与说明文字都记录到数据库内。仔细考虑后感觉这个应用不要数据库也能完成,我实现的方案是把说明文字URLENCODE后当做文件名,这样当我读取文件的时候再把文件名URLDECODE就可以后驱图片的文字说明了。

可是通过浏览器访问图片时却提示找不到文件,如有一张图片的说明文字为“琼台博客”,URLENCODE后生成的文件名如下

%E7%90%BC%E5%8F%B0%E5%8D%9A%E5%AE%A2.jpg

于是我通过浏览器访问图片,提示找不到

访问编码后的中文URL返回404错误的解决方法

仔细看了一下,发现浏览器访问的时候自动把文件名给转回中文了

火狐

访问编码后的中文URL返回404错误的解决方法

chrome

访问编码后的中文URL返回404错误的解决方法

IE

访问编码后的中文URL返回404错误的解决方法

Safari

访问编码后的中文URL返回404错误的解决方法

IE与Safari从地址栏上没有看出转为汉字,但也同样都提示找不到文件。但我感觉应该是它请求的时候也都自动转了,只不过地址栏上的没有显示转换后的。从Nginx的访问记录看访问图片时的请求情况

 192.168.6.30 - - [12/Oct/2012:10:09:44 +0800] "GET /%E7%90%BC%E5%8F%B0%E5%8D%9A%E5%AE%A2.jpg HTTP/1.1" 404 199 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"

请求URL处理没发现什么异常,最后通过反复研究编码后的文件名,发现都是由百分号与字母数字组成,我感觉应该是浏览器在遇到百分号时可能会做些其它转换处理了,所以导致浏览器访问URLENCODE后的文件提示找不到。

于是我把所有URLENCODE后的文件名里的百分号都用下划线替换

%E7%90%BC%E5%8F%B0%E5%8D%9A%E5%AE%A2.jpg

替换为

_E7_90_BC_E5_8F_B0_E5_8D_9A_E5_AE_A2.jpg

重新使用浏览器访问,问题解决

访问编码后的中文URL返回404错误的解决方法

如要获取图片的文字说明,直接把文件名的“_”替换回"%”再使用URLDECODE即可。

最后需要注意的是,Linux下文件名跟Win系统一样都有长度限制,目前最常用的格式为ext3,这中格式允许255个字符长度,扣除大约5个作为拓展名后大约剩余250个长度纯文件名,而一个汉字经过URLENCODE后的长度为9个,因此最大可以编码27个汉字做为文件名

虽然这种方式存储的汉字比较少,但可以利用一些加密方法获得较短的一串密文,再把这段密文URLENCODE即可,具体实现方式我就不一一举例,动手做做思考一下吧!

PHP 相关文章推荐
js下函数般调用正则的方法附代码
Jun 22 PHP
php zlib压缩和解压缩swf文件的代码
Dec 30 PHP
PHP中的string类型使用说明
Jul 27 PHP
windows7下安装php的imagick和imagemagick扩展教程
Jul 04 PHP
采用memcache在web集群中实现session的同步会话
Jul 05 PHP
PHP图片处理之图片旋转和图片翻转实例
Nov 19 PHP
PHP获取数组最大值下标的方法
May 12 PHP
Yii的Srbac插件用法详解
Jul 14 PHP
微信封装的调用微信签名包的类库
Jun 08 PHP
浅谈PHP中的Trait使用方法
Mar 22 PHP
PHP析构函数destruct与垃圾回收机制的讲解
Mar 22 PHP
解决laravel session失效的问题
Oct 14 PHP
PHP中使用localhost连接Mysql不成功的解决方法
Aug 20 #PHP
Smarty变量调节器失效的解决办法
Aug 20 #PHP
PHP编译安装中遇到的两个错误和解决方法
Aug 20 #PHP
PHP基于数组实现的分页函数实例
Aug 20 #PHP
PHP中读取照片exif信息的方法
Aug 20 #PHP
PHP函数eval()介绍和使用示例
Aug 20 #PHP
PHP命令行脚本接收传入参数的三种方式
Aug 20 #PHP
You might like
php在页面中调用fckeditor编辑器的方法
2011/06/10 PHP
php正则表达式(regar expression)
2011/09/10 PHP
PHP使用mkdir创建多级目录的方法
2015/12/22 PHP
PHP递归算法的简单实例
2019/02/28 PHP
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
cument.execCommand()用法深入理解
2012/12/04 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
axios对请求各种异常情况处理的封装方法
2018/09/25 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
Javascript Worker子线程代码实例
2020/02/20 Javascript
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
python使用Plotly绘图工具绘制水平条形图
2020/03/25 Python
Python比较配置文件的方法实例详解
2019/06/06 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
2019/12/25 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
2020/06/11 Python
详解Python 函数参数的拆解
2020/09/02 Python
Book Depository亚太地区:一家领先的国际图书零售商
2019/05/05 全球购物
爱护公物标语
2014/06/24 职场文书
信用卡工资证明格式
2014/09/13 职场文书
四风个人对照检查材料思想汇报
2014/09/25 职场文书
社区灵活就业证明
2014/11/03 职场文书
2014年劳动部工作总结
2014/12/11 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
Python基础之函数嵌套知识总结
2021/05/23 Python