访问编码后的中文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代码把全角数字转为半角数字
Dec 10 PHP
php URL验证正则表达式
Jul 19 PHP
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
Dec 25 PHP
通过缓存数据库结果提高PHP性能的原理介绍
Sep 05 PHP
CI框架Session.php源码分析
Nov 03 PHP
PHP Hash算法:Times33算法代码实例
May 13 PHP
php检测文本的编码
Jul 26 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
Feb 15 PHP
ThinkPHP静态缓存简单配置和使用方法详解
Mar 23 PHP
简单实现PHP留言板功能
Dec 21 PHP
php插件Xajax使用方法详解
Aug 31 PHP
PHP使用ActiveMQ实现消息队列的方法详解
May 31 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数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
php的zip解压缩类pclzip使用示例
2014/03/14 PHP
php操作xml入门之cdata区段
2015/01/23 PHP
PHP中的一些常用函数收集
2015/05/26 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
2017/10/10 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
laravel 解决Validator使用中出现的问题
2019/10/25 PHP
Cookie跨域问题解决方案代码示例
2020/11/24 PHP
JavaScript中创建类/对象的几种方法总结
2013/11/29 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
2014/08/15 Javascript
Nodejs实现多人同时在线移动鼠标的小游戏分享
2014/12/06 NodeJs
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
jQuery动画效果相关方法实例分析
2015/12/31 Javascript
编写高质量JavaScript代码的基本要点
2016/03/02 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
JavaScript变量基本使用方法实例分析
2019/11/15 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
vue 使用async写数字动态加载效果案例
2020/07/18 Javascript
python基础教程之面向对象的一些概念
2014/08/29 Python
Python实现数据库并行读取和写入实例
2017/06/09 Python
python决策树之CART分类回归树详解
2017/12/20 Python
selenium在执行phantomjs的API并获取执行结果的方法
2018/12/17 Python
使用Python 正则匹配两个特定字符之间的字符方法
2018/12/24 Python
python进程和线程用法知识点总结
2019/05/28 Python
Python3 Tkinter选择路径功能的实现方法
2019/06/14 Python
Django中信号signals的简单使用方法
2019/07/04 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
Myprotein芬兰官网:欧洲第一运动营养品牌
2019/05/05 全球购物
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
30年同学聚会邀请函
2014/01/25 职场文书
什么是就业协议书
2014/04/17 职场文书
数学系毕业生求职信
2014/05/29 职场文书
2015年教师节广播稿
2015/08/19 职场文书
一篇文章带你搞懂Python类的相关知识
2021/05/20 Python
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏