Forum Discussion
Mobile Device Detection with logic
I seem to be spinning my wheels here and I am not sure why. I want to do the following:
1. Detect if a user is coming from a mobile device (for simplicity, we will say only iPhone, iPad, Android, Blackberry, and Windows Mobile)
2. Redirect the user to a mobile optimized site, but:
a. If the user has already been to the mobile site, then exit from detection and allow to full site.
b. If the user is going to a specific URI on the full site, redirect to the specific site on the mobile (trying to accomplish with a Class Search
c. All others should go to mobile site if detected, else go to full site.
d. I will also need some form of tracking (a) to ensure the user does not go back to the mobile site for the duration of the session (not sure how to do this other than cookie which is not supported by ALL devices.
Below is what I have so far, but it does not seem to be working, and I do not know why???
when HTTP_REQUEST {
set uri [string trimright [HTTP::uri] "/" ]
set mobile_site "http://m.site.com"
set full_site "http://www.site.com"
if {$uri eq "/?mobile=false"} {
HTTP::redirect $full_site
event disable
} else {
set mobile_opt_uri [class search -value mobile_phone_optimized eq [string tolower $uri]]
switch -glob [string tolower [HTTP::header User-Agent]] {
"*blackberry*" -
"*wp7*" -
"*androi*" -
"*iphone*" -
"*ipad*" {
if {$mobile_opt_uri ne "" } {
HTTP::redirect $mobile_site }
HTTP::redirect $mobile_site/$mobile_opt_uri
}
}
}
if { [string tolower [HTTP::header Accept]] contains "vnd.wap.wml" } {
HTTP::redirect $mobile_site
return
}
}
- nitassEmployee
is www.site.com and m.site.com same virtual server or different?
if {[class match -- [string tolower [HTTP::header "User-Agent"]] contains mobile_class]}{
- cokeefe28_17139NimbostratusFirst off, thank you for your response. To further clarify, here is an example....
If I go to www.site.com from my mobile device, I want to detect the mobile device and redirect to m.site.com. If I go to a specific URL as defined in a class (easier to expand the list as devlopers create additional optimized pages for mobile devices) for example www.site.com/uri1 and the device is detected as a mobile device, then redirect to m.site.com/uri1. If the class search comes up empty, redirect to m.site.com.
If I have gone through the detection already (as a user) and I choose to go to the full site by clicking a hyperlink on the mobile site (www.site.com/?mobile=false) then redirect back to www.site.com and exit from further processing. Of course I need a way to track the user so that they do not continue in a loop of going back to the mobile site.
I hope this helps! I thought that I was half way there but I just can't seem to make the logic after switch work. It always redirects me back to the mobile site. I was thinking that this would only need to go onto the www.site.com VS.....and yes, they are two separate VS's but I have not emotional tie to it being that way.
- nitassEmployeeI choose to go to the full site by clicking a hyperlink on the mobile site (www.site.com/?mobile=false) then redirect back to www.site.com and exit from further processing.i think the problem is here since after redirection, browser may create a brand new connection to www virtual server and it will be redirected to mobile virtual server again. local variable is not shared across connection. for global variable, i am not sure what data we can use. ip address might not be a good idea because mobile device may be behind nat device. cookie is not an option as you mentioned it is not supported on all device.
- cokeefe28_17139NimbostratusHow does everyone else do this? Is it typically done in code on the server or detected in apache, iis, etc.?
- hooleylistCirrostratusYou should be able to set a cookie to track whether the client has opted for either the full site or mobile site based on requests to www.site.com/?mobile=false or a URI which selects the mobile site. Here's a rough idea of what I'm thinking:
Main (non-mobile) site iRule when HTTP_REQUEST { Use full site if user has main (non-mobile) site cookie if {[HTTP::cookie site] eq "main"}{ Do not redirect clients who have manually opted for the main site } else { User has not manually opted for the main site Check if the client is a mobile if {[class match -- [string tolower [HTTP::header "User-Agent"]] contains mobile_class]}{ if {[class match -- [string tolower [HTTP::uri]] contains specific_uri_class]} { set mobile_opt_uri [class match -value [string tolower [HTTP::uri]] contains specific_uri_class] HTTP::redirect "http://m.site.com$mobile_opt_uri" } else { HTTP::redirect "http://m.site.com/" } } } } Mobile site iRule when HTTP_REQUEST { Check if request is to a URI which indicates a mobile user wanting to use the main site if {[HTTP::query] eq "mobile=false"}{ Redirect to main site with a cookie to track the user wants to stay on the main site HTTP::respond 302 Location "http://www.site.com/" Set-Cookie "Site=main; domain=.site.com"; path="/";" } }
- hooleylistCirrostratus...dupe post
- cokeefe28_17139NimbostratusI have gotten the following to work....a little of Aaron and a little of mine, but I think that Nitass is right....I may not be able to track this with a cookie since most mobile devices don't use cookies. Src IP will not work because there are the cases of NAT. I think that the only way that I can get this to work is by only executing this on the front login page (say index.htm) and have all the other pages reference home.htm. That way I can put something in there that says If not HTTP::uri /index.htm....exit. Thoughts? Here is the iRule.
Recent Discussions
Related Content
* Getting Started on DevCentral
* Community Guidelines
* Community Terms of Use / EULA
* Community Ranking Explained
* Community Resources
* Contact the DevCentral Team
* Update MFA on account.f5.com