访问编码后的中文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 相关文章推荐
mysql 中InnoDB和MyISAM的区别分析小结
Apr 15 PHP
php对mongodb的扩展(初出茅庐)
Nov 11 PHP
解析PHP生成静态html文件的三种方法
Jun 18 PHP
PHP函数之日期时间函数date()使用详解
Sep 09 PHP
php实现根据url自动生成缩略图的方法
Sep 23 PHP
PHP中curl_setopt函数用法实例分析
Apr 16 PHP
php示例详解Constructor Prototype Pattern 原型模式
Oct 15 PHP
PHP 极验验证码实例讲解
Sep 29 PHP
PHP开发之用微信远程遥控服务器
Jan 25 PHP
php学习笔记之mb_strstr的基本使用
Feb 03 PHP
PHP通过文件路径获取文件名的实例代码
Oct 14 PHP
PHP读取文件或采集时解决中文乱码
Mar 09 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
一步一步学习PHP(3) php 函数
2010/02/15 PHP
php对大文件进行读取操作的实现代码
2013/01/23 PHP
PHP框架Laravel的小技巧两则
2015/02/10 PHP
PHP使用array_fill定义多维数组的方法
2015/03/18 PHP
浅谈PHP中output_buffering
2015/07/13 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
JS 两个字符串时间的天数差计算
2013/08/25 Javascript
提取字符串中年月日的函数代码
2013/11/05 Javascript
js判断文本框输入的内容是否为数字
2015/12/23 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
2016/06/24 Javascript
微信jssdk用法汇总
2016/07/16 Javascript
原生JS获取元素的位置与尺寸实现方法
2017/10/18 Javascript
实现单层json按照key字母顺序排序的示例
2017/12/06 Javascript
Vue 项目中遇到的跨域问题及解决方法(后台php)
2018/03/28 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
2018/05/22 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
element ui 表格动态列显示空白bug 修复方法
2018/09/04 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
vue el-tree 默认展开第一个节点的实现代码
2020/05/15 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
Python实现购物车功能的方法分析
2017/11/10 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
浅谈Pandas Series 和 Numpy array中的相同点
2019/06/28 Python
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
7 For All Mankind官网:美国加州洛杉矶的高级牛仔服装品牌
2018/12/20 全球购物
班级道德讲堂实施方案
2014/02/24 职场文书
硕士生工作推荐信
2014/03/07 职场文书
红头文件任命书范本
2014/06/05 职场文书
工程索赔意向书
2014/08/30 职场文书
QT连接MYSQL数据库的详细步骤
2021/07/07 MySQL
Python echarts实现数据可视化实例详解
2022/03/03 Python