访问编码后的中文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中的cookie
Nov 26 PHP
PHP添加MySQL数据记录代码
Jun 07 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
Sep 29 PHP
php对称加密算法示例
May 07 PHP
php mb_substr()函数截取中文字符串应用示例
Jul 29 PHP
PHP Session机制简介及用法
Aug 19 PHP
php用户密码加密算法分析【Discuz加密算法】
Oct 12 PHP
Zend Framework基于Command命令行建立ZF项目的方法
Feb 18 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
Mar 28 PHP
php中输出json对象的值(实现方法)
Mar 07 PHP
php识别翻转iphone拍摄的颠倒图片
May 17 PHP
php判断目录存在的简单方法
Sep 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
在PHP的图形函数中显示汉字
2006/10/09 PHP
php绘制一条直线的方法
2015/01/24 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
2016/11/21 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
2012/12/23 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
jQuery多个input求和的实现方法
2015/02/12 Javascript
浅析JS运动
2015/12/28 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
用jquery的attr方法实现图片切换效果
2017/02/05 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
JavaScript截屏功能的实现代码
2017/07/28 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
2018/12/30 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
Pycharm学习教程(2) 代码风格
2017/05/02 Python
在django view中给form传入参数的例子
2019/07/19 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
python能否java成为主流语言吗
2020/06/22 Python
python和js交互调用的方法
2020/06/23 Python
了解一下python内建模块collections
2020/09/07 Python
Microsoft新加坡官方网站:购买微软最新软件和技术产品
2016/10/28 全球购物
linux面试题参考答案(11)
2016/11/26 面试题
医学院毕业生自荐信
2013/11/08 职场文书
施工班组长岗位职责
2014/01/05 职场文书
高校群众路线教育实践活动剖析材料
2014/10/10 职场文书
工伤事故赔偿协议书
2014/10/27 职场文书
2015年建筑工程工作总结
2015/05/13 职场文书
文艺晚会开场白
2015/05/29 职场文书
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA
SpringBoot接入钉钉自定义机器人预警通知
2022/07/15 Java/Android