『对某个内信的引用』
当我第N次收到类似的内容时,我认识到:看来,了解更多关于URL的知识,对大家真的很重要。
『什么是URL参数』
(阅读说明:只有我声明“全文完”时,本文才完全结束。我正在续写它。)
看这个地址:
http://hu60.cn/php.php.gz?a=b&c=d&e=f&g=f/x.mp3,访问它之后,你会发现你下载到了一个文件名为php.php.gz的文件。很多人会问:为什么文件名不是x.mp3呢?这个URL不是以x.mp3结尾的吗??
是的,这个URL的结尾是x.mp3。那么,我们下载到的文件为什么不是x.mp3呢??似乎,我们在这里武断地下了这样一个结论:URL的结尾就是文件名。而事情,其实不是这样的。
一个常见的URL通常都有域名。在域名之后,跟着的是用斜杠“/”分隔开的目录和文件名。但是,在这些目录和文件之后,URL还有非常重要的一部分:参数。
参数,从URL中的第一个问号“?”开始,直到URL的结束。
http://hu60.cn/php.php.gz?a=b&c=d&e=f&g=f/x.mp3
在上面的URL中,用红色标出的部分就是参数了(没看到颜色的是你的浏览器问题)。在参数的前面才是真正的文件名。我们看看,它正是“php.php.gz”。
『URL参数怎样被解读』 参数的作用是什么?当然是把一些信息传递给服务器。那么服务器能够从“?a=b&c=d&e=f&g=f/x.mp3”这样一串文字中得到什么呢?要想知道这个问题的答案,我们应该先观察一下这串文字的特征。似乎,它符合某种特定的格式……
大家看出来了吗?如果我们忽略最开始的问号,那么这串文字就可以看做由多个形如“XX=YY”的“等式”组成,而两个等式之间呢,用“&”连接。这就是URL参数的基本结构。
在“XX=YY”中,XX是参数名(或者叫做变量名,学过数学或编程的人都知道变量是什么吧),YY是变量XX的值。比如这个贴子的地址:
http://hu60.cn/wap/read.php?id=bbs_tz&tzid=13490&bkid=6
我们看到,它的参数部分由三对“XX=YY”组成,分别是“id=bbs_tz”、“tzid=13490”和“bkid=6”。它们分别代表什么呢?
在我的论坛程序中,我规定“id”代表“要访问的页面”,“tzid”代表“贴子的序号”,“bkid”代表贴子所在版块的序号。
当你通过上面的地址访问我的服务器时,服务器里安装的我的论坛程序就会得知:哦,你要访问一个名为“bbs_tz”的页面,我找找,原来是贴子内容查看页啊。嗯,你要看绿虎论坛的第13490篇贴子,好的,我找到了。哦,我还知道了,这贴子属于论坛的第6个版块,数一数,是“编程学院”。
于是,通过你提交过来的三个参数,服务器成功找到了贴子,并正常地显示了出来。如果参数不正常会怎样呢?有兴趣的同学可以尝试改变参数的名字或者值,看看会有什么特别的情况发生。
『空参数、无效参数』
http://hu60.cn/wap/read.php?id=http://hu60.cn/wap/read.php?m=99999&c=77777&id=index&x=10086&y=31131http://hu60.cn/wap/read.php 它们的参数完全不同,但是它们得到的结果是相同的:全都进入了虎绿林的首页。是什么原因使它们没有差别?我们一个一个分析吧:
第一个:只有一个参数,“id=”,按照XX=YY的格式解析,这里的XX就是id,而YY,是空的。之前我们说过,我在写这个程序时规定了id代表要访问的页面。那么既然id为空,为什么不是“空白页面”,而是出现了首页呢?
原因很简单:这个程序是我写的。我当然可以再加这样一个规定:如果id为空,那么就访问首页。
举这个例子是想要告诉大家:参数的“作用”是什么,是由程序员自己规定的。同样名字的参数,在不同的网页里面或许有完全不同的含义。就比如,如果我愿意,我完全可以让参数id代表贴子序号,bkid代表要访问的页面,tzid代表版块。所以,请不要总是固执地认为参数sid一定代表用户的身份信息,虽然大多数时候都是这样,但也许在另一个特立独行的程序里,它就被用来代表你的年龄。
第二个“
http://hu60.cn/wap/read.php?m=99999&c=77777&id=index&x=10086&y=31131”有一大堆参数,m、c、id、x、y,但是,由于我在写这个程序时只用到了里面的参数id,所以其他的“无效参数”就被服务器自动无视了。参数id的值是index(代表首页),所以当然就出现了首页。
第三个:
http://hu60.cn/wap/read.php,没有参数。但是我要用参数id,怎么办呢?服务器说:好办啊,“没有”与“空白”是一样一样的。
所以,如果一个参数不存在,那么要用它时,就认为它是空的。于是,这就和第一种情况一样了。
所以,“
http://f.10086.cn/d/dlkjava.fcc?clientId=938&f=&tl=&mul=&commondownloadUrl=地址”中的空参数“f”、“tl”和“mul”被我省略了,当然多余的“&”也一起被省略。
『URL参数的编码』
(先上我的语文课再说)
『在用户CCTVBB的召唤下,我开始完成这篇贴子。』
之前的例子中,我们的参数值都是英文和数字。那么其他东西,比如中文,比如那个特殊符号&,如果它们出现在参数值中,要怎么办呢?
例:x=a&b
它会被解释成两部分,x=a和b=空。而我们的本意是要让a&b这个整体做为x的值。
于是,另一个特殊符号出现了,它是%,相信你经常在百度搜索的网址中看到它吧。
所有a-zA-Z0-9._-之外的字符都会被转换成%nn的形式,nn是这个字符的十六进制编码,必须是两位(两位十六进制数表示一个字节),如果不足两位则在前面补0,如果多余两位则分成几部分写。
比如,&的十六进制编码是26,所以写成x=a%26b就行了,服务器会自动把参数x的值解码成a&b。
再比如,“虎”字的UTF-8编码是E8 99 8E,所以你在百度WAP搜索“虎”时将看到word=%E8%99%8E(www版百度使用的不是UTF-8而是GBK编码,将得到不同的结果。)。
如果你有一个十六进制编辑器,打开任何一个文件,把十六进制表示的每个字节前面都加上符号%并不留空格地写在一起,那么你就得到了这个文件的URL编码。URL编码不仅能传递文字,实际上它可以无损地传递任何二进制数据,只要服务器允许的URL足够长。
另外,如果要表示%自身,需编码为%23(23是%在ASCII码表中的十六进制值)。
『#与锚链接』
之前我说过,URL中的参数部分是从?开始直到URL结束,其实并不准确。看例子:
http://hu60.tzhwap.com/wap/read.php?id=bbs#bottom 按之前的分析,参数id的值是bbs#bottom。而实际上,服务器接收到的完整URL仅仅是
http://hu60.tzhwap.com/wap/read.php?id=bbs,井号#和之后的内容根本没有被发往服务器!(备注:发现冒泡浏览器的又一BUG:不支持锚链接!它错误地把#及后面的内容发给服务器,导致404错误)
那么,#及后面的数据是做什么用的呢?部分浏览器用户可能会发现,点击链接进入后,不是像平等那样停在了页面的顶部,而是底部!那是因为我在底部埋了一个名为bottom的锚(<a name="bottom"></a>)在html中,通过结尾带#bottom的链接就可以定位到埋锚的位置了。
锚链接在wml中有别的意思,它用来在多个<card id="锚名">之间切换。
『具有所有部分的网址』
以下是一个具有所有部分的网址的示例:
http://myname@hu60.tzhwap.com:80/wap/read.php?id=chat&d=%E8%99%8E#bottom其中myname传递一个用户名给服务器(myname
@部分可省,而且也不常用)。hu60.tzhwap.com是域名。80是服务器端口(:80可省,默认是80)。其他的都已经介绍过了。
[全文完]