访问编码后的中文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+DBM的同学录程序(1)
Oct 09 PHP
PHP 验证码的实现代码
Jul 17 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 PHP
PHP详解ASCII码对照表与字符转换
Dec 05 PHP
PHP对接微信公众平台消息接口开发流程教程
Mar 25 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
Jul 25 PHP
详解PHP对象的串行化与反串行化
Jan 24 PHP
php通过执行CutyCapt命令实现网页截图的方法
Sep 30 PHP
PHP中串行化用法示例
Nov 16 PHP
php结合redis高并发下发帖、发微博的实现方法
Dec 15 PHP
PHP脚本自动识别验证码查询汽车违章
Dec 20 PHP
Yii2实现多域名跨域同步登录退出
Feb 04 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 date函数参数详解
2006/11/27 PHP
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
JQUERY获取form表单值的代码
2010/07/17 Javascript
jquery中.add()的使用分析
2013/04/26 Javascript
jQuery操作CheckBox的方法介绍(选中,取消,取值)
2014/02/04 Javascript
javascript异步编程的4种方法
2014/02/19 Javascript
js实现下拉列表选中某个值的方法(3种方法)
2015/12/17 Javascript
分分钟玩转Vue.js组件
2016/10/25 Javascript
原生js实现弹出层登录拖拽功能
2016/12/05 Javascript
AngularJS入门示例之Hello World详解
2017/01/04 Javascript
基于Bootstrap实现城市三级联动
2017/11/23 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
[01:33:07]VGJ.T vs Newbee Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python和php通信乱码问题解决方法
2014/04/15 Python
在Django的URLconf中使用命名组的方法
2015/07/18 Python
Python 2与Python 3版本和编码的对比
2017/02/14 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
tensorflow 1.0用CNN进行图像分类
2018/04/15 Python
Django中的ajax请求
2018/10/19 Python
Python中is和==的区别详解
2018/11/15 Python
详解Python IO口多路复用
2020/06/17 Python
Python实现播放和录制声音的功能
2020/08/12 Python
Css3新特性应用之形状总结
2016/12/08 HTML / CSS
美国眼镜网站:EyeBuyDirect
2017/04/13 全球购物
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
shell的种类有哪些
2015/04/15 面试题
消防安全管理制度
2014/02/01 职场文书
家长对老师的感言
2014/03/11 职场文书
五一劳动节演讲稿
2014/09/12 职场文书
2015年社区综治工作总结
2015/04/21 职场文书
5个实用的JavaScript新特性
2022/06/16 Javascript