php.ini 的 arg_separator.output 设置

jackxiang 2012-1-5 14:56 | |
来自微博客:
agentzh:今天经过一位熟悉 PHP 的 ngx_lua 用户的提点,我才知道 W3C 标准建议服务器支持使用分号字符(;)作为查询串(query string)中的参数对分隔符。PHP 支持通过 arg_separator 配置指令修改此分隔符:http://t.cn/SiBspe 看来有必要在 ngx_lua 中也引入一条 lua_arg_separator 配置指令了,呵呵。

两篇来自网络的文章说明此事即可。如下:
http_build_query是用来生成URL请求字符串的函数,很简单.不过今天却出现了一点小意外,在本机安装公司社区时,出现了无法登录的情况.但在测试服务器正常.经过地毯式排错,找到问题代码(仅演示,屏蔽敏感内容):


测试服务器得到结果为:
usr=touchboy&pwd=123456&ip=127.0.0.1&src=account
而我本地结果为:
usr=touchboy&pwd=123456&ip=127.0.0.1&src=account
中间的连接符出现了差异,服务器为正常的”&”,而我本地却是转义后的”&”,最终导致本地提交数据错误.
查看手中的PHP手册,http_build_query一节对此问题只字未提.所以想到的补救方法就只有用htmlspecialchars_decode($query)还原连接符.不过始终觉得可疑,为什么两台机子结果不一样.开始怀疑是linux(服务器)和windows(本机)的差异,但经过对另一台windows机子的测试,结果正常.后就怀疑是环境配置的问题,经过一番google,果然真相大白.问题元凶在php.ini配置中一行:
[/codes]arg_separator.output = “&”[/codes]
将arg_separator.output定义为”&”,重启apache,问题解决!
顺带说下PHP手册的问题,因我用的手册是之前比较经典的《PHP5中文手册文档版》(2006-11-05编译),2年半以前的东东,内容应该停留在PHP 5.1.0的阶段.很多内容已经滞后了.之后下载了陈浩(Haohappy)的《PHP中文手册》(2009-02-15编译),查看http_build_query一节,发现里面出现一行相关提示:

到官方查看最新手册,发现里面有更详尽阐述,说明在5.1.2版增加了$arg_separator 参数可以解决此问题.看来中文的手册滞后还是很严重,5.1.2应该是一年前发布的,而2009-02-15编译的最新中文手册仍未收录相关内容.
简而言之,遇到PHP函数故障,节省时间的最好解决方法:
1.第一时间到PHP官方查找答案.
2.保证自己手中的PHP手册是最新的.
=========================================================================
php通过curl提交数据,需要开启curl功能,在php.ini文件中取消注释

;extension=php_curl.dll
改为
extension=php_curl.dll
重启apache服务器生效。

使用php的curl模块获取或者提交数据都是很方便的,但是使用中遇到了这样的一个问题:提交数据时出错,服务器返回400错误。

下面先给出一个通过curl提交数据的php文件示例:
直接传递数组时,一切正常,但是将数组编码后,服务器返回出错信息

HTTP Status 400 – Syntactically incorrect

Description: The request sent by the client was syntactically incorrect ().

经过对比测试,可以看到编码前的参数

Array ( [username] => test-user [password] => 789cbe0407840b1c2041cb33452ff60f19bf58cc [timestamp] => 1314842207975 )

经过http_build_query编码后的参数

username=test-user&password=789cbe0407840b1c2041cb33452ff60f19bf58cc&timestamp=1314842207975

正是编码后的这个连接符&导致的问题

在php.ini文件有如下的配置项:

; The separator used in PHP generated URLs to separate arguments.
; PHP’s default setting is “&”.
; http://php.net/arg-separator.output
; Example:
arg_separator.output = “&”

在xampp中,php默认的配置是启用的

;arg_separator.output = “&”

将其注释后重启服务器,不再报错。

不修改php全局配置也可以,在php脚本里设置一下就行

ini_set(‘arg_separator.output’, ‘&’);

注意:小心与   HTML   实体相匹配的变量。像   &amp、&copy   和   &pound   都将被浏览器解析,并使用实际实体替代所期待的变量名。这是明显的混乱,W3C   已经告诫人们好几年了。参考地址:http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2   PHP   通过   arg_separator   .ini   指令,支持将参数分割符变成   W3C   所建议的分号。不幸的是大多数用户代理并不发送分号分隔符格式的表单数据。较为简单的解决办法是使用   &   代替   &   作为分隔符。你不需要为此修改   PHP   的   arg_separator。让它仍为   &,而仅使用   htmlentities(urlencode($data))   对你的   URL   进行编码。  


我想问的就是如何把url中的?替换成其他的,比如替换成@,而php仍然能正常接受变量。

比如  
http://localhost/test.php?@a=b
在test.php中我依然可以用
$_GET[ 'a ']取得a的值=b

==============================================================================

来源:http://flyash.itcao.com/post_1065.html
http://www.etang.info/php-it/Default.aspx?__tencentip=10.16.64.112&__tencentid=1&__tencentrawurl=http://www.etang.info/php-it/http_build_query.html

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/4905/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!

评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]