访问编码后的中文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学习 计数器实例代码
Jun 15 PHP
PHP下操作Linux消息队列完成进程间通信的方法
Jul 24 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
Jun 13 PHP
Function eregi is deprecated (解决方法)
Jun 21 PHP
php下载excel无法打开的解决方法
Dec 24 PHP
PHP生成条形图的方法
Dec 10 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
Oct 13 PHP
php实现遍历多维数组的方法
Nov 25 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
Mar 05 PHP
PHP查询大量数据内存耗尽问题的解决方法
Oct 28 PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 PHP
php 防护xss,PHP的防御XSS注入的终极解决方案
Apr 01 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
收音机另类DIY - 纸巾盒做外壳
2021/03/02 无线电
php中文件上传的安全问题
2006/10/09 PHP
pw的一个放后门的方法分析
2007/10/08 PHP
PHP 日常开发小技巧
2009/09/23 PHP
PHP获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
2016/06/13 PHP
彻底搞懂JS无缝滚动代码
2007/01/03 Javascript
javascript使用正则获取url上的某个参数
2014/09/04 Javascript
深入探讨前端框架react
2015/12/09 Javascript
javascript鼠标右键菜单自定义效果
2020/12/08 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
JS实现碰撞检测的方法分析
2018/01/19 Javascript
ztree加载完成后显示勾选节点的实现代码
2018/10/22 Javascript
node.js的Express服务器基本使用教程
2019/01/09 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
Python去除字符串前后空格的几种方法
2019/03/04 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
python opencv实现简易画图板
2020/08/27 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
The North Face北面荷兰官网:美国著名户外品牌
2019/10/16 全球购物
Java面试题:Java类的Main方法如果是Private将会怎么样
2016/08/18 面试题
计算机软件个人的自荐信范文
2013/12/01 职场文书
后进生转化工作制度
2014/01/17 职场文书
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
实验教师岗位职责
2014/02/13 职场文书
2014年协会工作总结
2014/11/22 职场文书
2016党性教育学习心得体会
2016/01/21 职场文书
html+css实现赛博朋克风格按钮
2021/05/26 HTML / CSS
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
2021/06/13 Python
教你用Python爬取英雄联盟皮肤原画
2021/06/13 Python
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android