访问编码后的中文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 相关文章推荐
PHP数据库开发知多少
Oct 09 PHP
一步一步学习PHP(5) 类和对象
Feb 16 PHP
php标签云的实现代码
Oct 10 PHP
学习php分页代码实例
Oct 24 PHP
小谈php正则提取图片地址
Mar 27 PHP
PHP实现算式验证码和汉字验证码实例
Mar 09 PHP
php准确获取文件MIME类型的方法
Jun 17 PHP
PHP可变变量学习小结
Nov 29 PHP
CI框架实现cookie登陆的方法详解
May 18 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
Jan 20 PHP
PHP实时统计中文字数和区别
Feb 28 PHP
Laravel 5.1 框架Blade模板引擎用法实例分析
Jan 04 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 快速生成 Flash 动画的方法
2007/03/06 PHP
C#使用PHP服务端的Web Service通信实例
2014/04/08 PHP
常见php数据文件缓存类汇总
2014/12/05 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
通过命令行创建vue项目的方法
2017/07/20 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
JS中touchstart事件与click事件冲突的解决方法
2018/03/12 Javascript
vue如何获取自定义元素属性参数值的方法
2019/05/14 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
2019/09/13 Javascript
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
[01:08:33]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Django中ORM表的创建和增删改查方法示例
2017/11/15 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
Python实现读取txt文件并转换为excel的方法示例
2018/05/17 Python
Python延时操作实现方法示例
2018/08/14 Python
Python Pandas中根据列的值选取多行数据
2019/07/08 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
Python调用JavaScript代码的方法
2020/10/27 Python
CSS3中的元素过渡属性transition示例详解
2016/11/30 HTML / CSS
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
html5 学习简单的拾色器
2010/09/03 HTML / CSS
大学毕业自我鉴定范文
2014/02/03 职场文书
《春笋》教学反思
2014/04/15 职场文书
高中班级口号
2014/06/09 职场文书
业绩倒数第一的检讨书
2014/09/24 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
2015年仓管员工作总结
2015/04/21 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
教师研修随笔感言
2015/11/18 职场文书