访问编码后的中文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统计目录下的文件总数及代码行数(去除注释及空行)
Jan 17 PHP
基于MySQL分区性能的详细介绍
May 02 PHP
php中mkdir函数用法实例分析
Nov 15 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
Jan 08 PHP
PHP生成可点击刷新的验证码简单示例
May 13 PHP
eclipse php wamp配置教程
Jun 30 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
Feb 10 PHP
详解php实现页面静态化原理
Jun 21 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
实例讲解php将字符串输出到HTML
Jan 27 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
Feb 10 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
May 02 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中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
php使用curl访问https示例分享
2014/01/17 PHP
php+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
调试php程序的简单步骤
2019/10/04 PHP
javascript代码运行不出来执行错误的可能情况整理
2013/10/18 Javascript
使用POST方式弹出窗口的两种方法示例介绍
2014/01/29 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
node.js中的url.format方法使用说明
2014/12/10 Javascript
javascript中数组方法汇总
2015/07/07 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
vue2组件之select2调用的示例代码
2017/10/12 Javascript
vue中动态绑定表单元素的属性方法
2018/02/23 Javascript
JavaScript 下载svg图片为png格式
2018/06/21 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
vue router 传参获取不到的解决方式
2019/11/13 Javascript
nodejs制作小爬虫功能示例
2020/02/24 NodeJs
javascript实现图片轮换动作方法
2020/08/07 Javascript
vue3+typeScript穿梭框的实现示例
2020/12/29 Vue.js
python中pygame针对游戏窗口的显示方法实例分析(附源码)
2015/11/11 Python
python将回车作为输入内容的实例
2018/06/23 Python
python实现Virginia无密钥解密
2019/03/20 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
Python笔记之facade模式
2019/11/20 Python
使用Python脚本从文件读取数据代码实例
2020/01/19 Python
python词云库wordcloud的使用方法与实例详解
2020/02/17 Python
印度网上药店:1mg
2017/10/13 全球购物
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
2015年项目工作总结
2015/04/29 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
2016学习全国教书育人楷模先进事迹心得体会
2016/01/21 职场文书
maven依赖的version声明控制方式
2022/01/18 Java/Android