访问编码后的中文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与SQL注入攻击[三]
Apr 17 PHP
黑夜路人出的几道php笔试题
Aug 04 PHP
php 攻击方法之谈php+mysql注射语句构造
Oct 30 PHP
PHP中的生成XML文件的4种方法分享
Oct 06 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
Jun 13 PHP
php网站判断用户是否是手机访问的方法
Nov 01 PHP
ThinkPHP3.1查询语言详解
Jun 19 PHP
php实现的IMEI限制的短信验证码发送类
May 05 PHP
WordPress中用于检索模版的相关PHP函数使用解析
Dec 15 PHP
PHP对称加密函数实现数据的加密解密
Oct 27 PHP
详解php框架Yaf路由重写
Jun 20 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
Mar 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
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
php的ddos攻击解决方法
2015/01/08 PHP
在html文件中也可以执行php语句的方法
2015/04/09 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
2015/03/26 Javascript
JS建造者模式基本用法实例分析
2015/06/30 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
2017/01/17 Javascript
NodeJS配置HTTPS服务实例分享
2017/02/19 NodeJs
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
详解JavaScript对象的深浅复制
2017/03/30 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
js读取本地文件的实例
2017/12/22 Javascript
webpack4.x开发环境配置详解
2018/08/04 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
2019/06/18 jQuery
JS实现电脑虚拟键盘打字测试
2020/06/24 Javascript
element日历calendar组件上月、今天、下月、日历块点击事件及模板源码
2020/07/27 Javascript
Python获取运行目录与当前脚本目录的方法
2015/06/01 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
python多线程同步之文件读写控制
2021/02/25 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
Python闭包及装饰器运行原理解析
2020/06/17 Python
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
幼儿园中班下学期评语
2014/04/18 职场文书
先进党支部事迹材料2016
2016/02/26 职场文书
导游词之山东孔庙
2019/11/04 职场文书
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android
Python内置数据类型中的集合详解
2022/03/18 Python
MySQL数据库实验实现简单数据库应用系统设计
2022/06/21 MySQL