Yes, it is perfectly possible. you just have to look at the right bits.
Fundamentally there is no difference between an Arduino and any other website, it's just somewhat simpler in how it operates.
All browsers follow the same rules - if they didn't they wouldn't work on the web. Two of the rules you are interested in are:
- Browsers identify themselves along with their OS.
- Browsers respond to the "result" code the website provides in a specific way.
Besides the GET request a browser also sends a list of headers. These contain lots of extra information about the request, including the domain name of the website that is being accessed (so the web server knows which site you want - it's not one webserver per site, that would be impractical. For instance, the request to show this page from Firefox on Linux has these headers:
Host: arduino.stackexchange.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.6.0
Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: (I won't bore you with this lot)
Connection: keep-alive
The header of note is the User-Agent: one. That tells the web server that I am using firefox from a 64-bit Intel Linux computer. If I were to do it from my Android phone it would tell you it's from Chrome on Android.
By looking for that header and parsing it for certain keywords you can find if you're serving to a mobile device or not.
Now the second bullet above - browsers respond to the response code in different ways. Normally you send the response code 200
which means "I accepted your request and here is the page you asked for". Another response code that is useful is code 301
which means "The page you asked for isn't at this address any more - here is the new address you should go to instead". That will then cause the browser to go to the newly provided address instead.
So instead of responding with
HTTP/1.0 200 OK
Content-type: text/html
<web page content here>
You could instead respond with:
HTTP/1.0 301 Moved Permanently
Location: http://myarduino.local/mobile
And the browser will redirect to the new address you give in the Location: response header.
The full list of response codes is here: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
If you want to avoid the overhead of a browser redirect you can just serve different data to the browser depending on what the User-Agent header specifies. After all, it's entirely down to you what is sent as the content of the page. Whether you get that from purely programmatical means, or by reading a file off an SD card, is entirely up to you.