$browser=="My S" || // unknown Ericsson devkit browser ? $browser=="WAPJ" || // Virtual WAPJAG www.wapjag.de $browser=="fetc" || // fetchpage.cgi Perl script from www.wapcab.de $browser=="ALAV" || // yet another unknown UP based browser ? $browser=="Wapa") // another unknown browser (Web based "Wapalyzer"?) { $br = "WML"; } else { $br = "HTML"; } } if($br == "WML") { // Force the browser to load the WML file instead header("302 Moved Temporarily"); header("Location: ".$wmlredirect); exit; } else { // Force the browser to load the HTML file instead header("302 Moved Temporarily"); header("Location: ".$htmlredirect); exit; } ?> 这个判断是在服务端完成的, PHP代码将首先查看网关是否接收text/vnd.wap.vml MIME类型。如果不是,将检测前面的字符,查看是否为WML浏览器。如果不符合,那么就假设为HTML浏览器。如果有新的WML浏览器,那么ID字符串也要增加。 这个代码基于Robert Whitinger(robert@wapsight.com)的代码,使用了Don Amaro(donamaro.concepcion@nl.unisys.com)提供的列表。 注意:由于只需要四个字符串就可以辨别,因此例如:"WapIDE-SDK/2.0;(R320s(Arial))" 可以使用“WapI”来代替是可行的做法,也是足够的。 同样的功能也可以通过ASP来解决。先判断请求的是“/index.wml” 或者 “/index.html” 和所需要的MIME类型。另外以下的脚本辨别的方式和上面不一样。另外还需要网关告诉服务器它能接收 的text/vnd.wap.wml MIME类型。该例子如下所示: <% Response.Buffer = TRUE Dim IsWap httpAccept = LCase(Request.ServerVariables("HTTP_ACCEPT")) if Instr(httpAccept,"wap") then IsWap=1 Else Response.Redirect "/index.html" : Response.Flush : Response.End End if %> <%Response.ContentType = "text/vnd.wap.wml"%><?xml version="1.0"?> <%Response.Flush%> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <card id="redirect"> <onevent type="onenterforward"> <go href="/index.wml"/> </onevent> <p> <a href="/index.wml">enter</a> </p> </card> </wml> <%Response.Flush:Response.End%> 30. 如何判断访问者是来自哪个浏览器或者移动电话? 可以通过检查HTTP_USER_AGENT标签来判断。例如试着使用Microsoft Internet Explorer访问一个站点的时候,HTTP_USER_AGENT将返回:Mozilla/4.0 (compatible;MSIE 5.0; Windows 98);在同样的情况下使用Nokia 7110访问这个站点,HTTP_USER_AGENT就会是:Nokia7110/1.0(04.73)。据此可以判断用户代理是什么类型的。 31. 可以得到用户代理的电话号码吗? 不可以,除非网关支持这个特点,WAP没有办法知道用户的电话号码。 32. 可以通过WML使得可以用WAP设备进行拨号吗? WAP的电话功能可以使用Wireless Telephony Application Interface(WTAI)。 例如: WMLScript: WTAPublic.MakeCall("9287787"); 但是第一代的WAP设备不支持这个功能。 33. 能够从WAP设备中读取数据吗,例如:电话号码? 这里有一些通过HTTP的信息,但是十分有限。既然只有网关发送过来少量的信息,像WAP设备的号码可能无法读取。同时,在某些国家这还涉及到个人隐私的问题。 基本上丢弃的内容就是WAP网关传送给HTTP服务器的内容。这不同于WAP网关到网关。Phone.com的UP.Link网关是一个最好的例子。因为它在HTTP头中返回一个字符串叫做 UP_X_SUBNO,里面包含了电话号码。Ericsson网关将传送一个辨别设备用的字符串,但是在明文中没有电话号码。 每次WAP设备向HTTP服务器请求一个URL,WAP网关就会将信息传送给HTTP服务器。 以下的PHP脚本显示了从网关过来的所有HTTP头的信息。可以使用WML浏览器进行测试。(http://wap.colorline.no/clientinfo.html)。其他的例子也可以在下面的UTL中找到:http://wap.colorline.no/demos.html 第一个部分是取得所有的标准HTTP头信息。第二个部分是提取一个内容。 <? header("Content-type: text/vnd.wap.wml"); echo("<?xml version=\"1.0\"?>\n"); echo("<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n\n"); echo("<!—Code written in Microsoft NOTEPAD.EXE \n"); ?> <wml> <card id="init" title="Client Info"> <p> <? // First part – standard HTTP stuff $headers = getallheaders(); while (list($header, $value) = each($headers)) { echo strtoupper($header). ": ". $value. "<br/>\n"; } // Second part // IP address of the client side echo("REMOTE_ADDR: ".$REMOTE_ADDR. "<br/>\n"); // Port at the client side echo("REMOTE_PORT: ".$REMOTE_PORT. "<br/>\n"); // Name of authenticated user echo("REMOTE_USER: ".$REMOTE_USER. "<br/>\n"); // Gateway Interface type echo("GATEWAY_INTERFACE: ".$GATEWAY_INTERFACE. "<br/>\n"); // Protocol used by the server echo("SERVER_PROTOCOL: ".$SERVER_PROTOCOL. "<br/>\n"); // Request Method echo("REQUEST_METHOD: ".$REQUEST_METHOD. "<br/>\n"); // Connection type echo("HTTP_CONNECTION: ".$HTTP_CONNECTION. "<br/>\n"); // Host it connected via (proxy) echo("HTTP_VIA: ".$HTTP_VIA. "<br/>\n"); ?> </p> </card> </wml> Henrik Gemal (gemal@dk.net)也有一个在线的基于WML的工具BrowserSpy,来显示更多关于HTTP头的信息、服务器环境和用户的浏览器等等。有关这个工具的详细情况可以浏览http://wap.gemal.dk/ Werner Forkel 提交了一个Perl的脚本,可以显示电话号码(如果有)。可以在以下位置测试:http://wap.colorline.no/wap-faq/apps/subnotest.wml,同样也收集在:http://wap.colorline.no/demos.html. 这些程序只适合某个网关。如果要测试其他的网关,可能就显示不出电话号码。因此电话号码不能作为ID号来处理。至少因为不是一个全球的标准。 |