访问编码后的中文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 相关文章推荐
一个ubbcode的函数,速度很快.
Oct 09 PHP
php 面试碰到过的问题 在此做下记录
Jun 09 PHP
php数组合并array_merge()函数使用注意事项
Jun 19 PHP
php禁止浏览器使用缓存页面的方法
Nov 07 PHP
php输出金字塔的2种实现方法
Dec 16 PHP
PHP实现采集抓取淘宝网单个商品信息
Jan 08 PHP
PHP实现的贪婪算法实例
Oct 17 PHP
PHP使用文件锁解决高并发问题示例
Mar 29 PHP
thinkphp5框架路由原理与用法详解
Feb 11 PHP
php将字符串转换为数组实例讲解
May 05 PHP
PHP底层运行机制与工作原理详解
Jul 31 PHP
Laravel登录失败次数限制的实现方法
Aug 26 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 expects parameter 1 to be resource, array given 错误
2011/03/23 PHP
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
CI框架安全类Security.php源码分析
2014/11/04 PHP
PHP中文竖排转换实现方法
2015/10/23 PHP
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
Js+Ajax,Get和Post在使用上的区别小结
2016/06/08 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
JavaScript 闭包机制详解及实例代码
2016/10/10 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
2020/05/13 Javascript
Threejs实现滴滴官网首页地球动画功能
2020/07/13 Javascript
JS实现炫酷雪花飘落效果
2020/08/19 Javascript
Flexible.js可伸缩布局实现方法详解
2020/11/13 Javascript
[01:54]TI珍贵瞬间系列(三):翻盘
2020/08/28 DOTA
Python标准异常和异常处理详解
2015/02/02 Python
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
Python跨文件全局变量的实现方法示例
2017/12/10 Python
彻彻底底地理解Python中的编码问题
2018/10/15 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
Python利用神经网络解决非线性回归问题实例详解
2019/07/19 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
如何在pycharm中安装第三方包
2020/10/27 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
Python制作运行进度条的实现效果(代码运行不无聊)
2021/02/24 Python
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
怎么写好自荐信
2013/10/30 职场文书
留学推荐信英文范文
2015/03/26 职场文书
公司副总经理岗位职责
2015/04/08 职场文书