8

I'm using this code to direct the users from desktop version to my mobile site.

 <?php
$useragent=$_SERVER['HTTP_USER_AGENT'];
if(preg_match('/android.+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i',$useragent)||preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i',substr($useragent,0,4)))
header('Location: http://mywebsite.com/mobile');
?>

i would like to give the users the option to switch back to desktop version from the mobile website but this code will redirect them back to mobile site. I was wondering if i can create an if statement to force the browser to stay on that page. for example if i can link back from mobile website using www.mywebsite.com?device=desktop and modify the code to recognize the url. my knowledge of PHP is limited so any help would be greatly appreciated.

SOLUTION:

** I tried to use session function as it was suggested in comments but i had issue with mobile devices. it seemed that some mobile browsers doesn't handle session very well.

** I used cookie instead and with the help of this post was able to solve the issue. Below is the code i'm using.

** NOTE: you can modify the detection code and time for setcookie to suit your needs

    <?php

    if (isset($_COOKIE['nomobile'])) {
      $version = "desktop";
    } else {

    if (preg_match('/iPhone|(...etc...)/', $_SERVER['HTTP_USER_AGENT'])) {
       $version = "mobile";
    } 

if ($version == "mobile") {
header('Location: http://yourwebsite.com/mobile');
}

    ?>

And you can use this code to create the cookie

<?php 
setcookie('nomobile', 'true');
   header('Location: http://yourwebsite.com');
?>
Community
  • 1
  • 1
PersianBoy67
  • 121
  • 2
  • 3
  • 8

2 Answers2

4

When the user clicks the 'Full Site' link, you can pass a variable to PHP by appending it to the URL. Here's an example of what the HTML link would look like on the mobile site:

<a href="http://mywebsite.com/?v=desktop">Full Site</a>

In PHP, the variable you passed in will be stored in $_GET['v'] ('v' is for version, but the naming is arbitrary). In your PHP code, you will first need to check whether $_GET['v'] is even set at all. If it is set, then you need to check whether or not it is set to 'desktop'. If both are true, then you should set a session variable so that if the user refreshes the page they won't be redirected to the mobile site again.

Now you need to check the session variable to see whether or not you should redirect the user. Again, you will need to first check that $_SESSION['v'] is set at all. If it is not set, then you should redirect the user. If it is set, then you need to check whether or not it is set to 'desktop'. If it is not set to 'desktop', then you should redirect the user. Here's what the code would look like:

// Set a session variable if the user prefers the desktop version
if (isset($_GET['v']) && $_GET['v'] == 'desktop') {
    $_SESSION['v'] == 'desktop';
}

// Detect browser and redirect mobile users unless they've already opted out
if (!isset($_SESSION['v']) || (isset($_SESSION['v']) && $_SESSION['v'] != 'desktop')) {
    // Place browser detection and redirection code here
}

One of the nice things about PHP is that it will handle sessions for you, but you must explicitly tell PHP to do so. You do this by using the session_start() function at the top of each page that needs to be part of the session. In this case, you would need a session_start() statement at the top of both the desktop site's page as well as the mobile site's page.

David Jones
  • 10,117
  • 28
  • 91
  • 139
  • 1
    As the OP's PHP knowledge is limited maybe an inclusion of session_start(); would be helpful? – 1321941 Jul 03 '12 at 17:08
  • Thank you for your reply. The process makes sense but i have issue implementing it. Where do i put the code for browser detection in your code? so basically i want to take the mobile user to mobile website first and then if they choose to go back they will stay on desktop version url and not be redirected back to mobile. – PersianBoy67 Jul 06 '12 at 13:54
  • You can put the browser detection code within the body of the second IF statement. I've edited my post to make that more clear. – David Jones Jul 06 '12 at 16:46
  • ok that's great. Now i have the same problem which i have with most of the codes i have used. When trying to get back to desktop version i get a loop which keep getting redirected to mobile version. I'm sure i'm doing something wrong. I'm using => Show desktop website to redirect back to the index.php but it sends me back to mobile website. it seems like the session is not working. as you suggested i added session_start(); on the top of my mobile page as well not sure if i did it write or not. – PersianBoy67 Jul 06 '12 at 17:54
  • That should work if you have a session_start() on your mobile site. Not sure how to help from here. Good luck... – David Jones Jul 06 '12 at 21:49
  • thanks a lot for your help. i noticed if i don't use session the code works fine. it seems the problem comes from mobile devices not being able to handle session function correctly. I'm using jQuery mobile i don't if i can assign session through jquery. I really don't know what else to do. – PersianBoy67 Jul 09 '12 at 18:19
0
<?php 
    $useragent = $_SERVER['HTTP_USER_AGENT']; 
    if(preg_match('ultralongregex', substr($useragent,0,4)) && (!isset($_GET['device']) || $_GET['device'] != 'desktop'))
    header('Location: http://mywebsite.com/mobile'); 
?> 

with $_GET you can get the variables in your query_string (the ?hello=foo&bar=world with urls). With $_GET['device'] you can explicitly use the ?device=desktop.

We ask: if the variable is not set or the variable is not desktop(when it's set) we redirect to mobile page.

EDIT: To improve this, you can store the GET in a SESSION variable (sessions will be started when you open a page and will only deleted when you close the browser):

Just add some part and modify the code:

<?php 
    //Check if GET['device'] is set AND the session variable is not set. If true, set the session variable
    if(isset($_GET['device']) && !isset($_SESSION['device'])) $_SESSION['device'] = $_GET['device'];
    //code from top
    $useragent = $_SERVER['HTTP_USER_AGENT']; 
    //Modify here: $_SESSION instead of $_GET
    if(preg_match('ultralongregex',substr($useragent,0,4)) && (!isset($_SESSION['device']) || $_SESSION['device'] != 'desktop'))
    header('Location: http://mywebsite.com/mobile'); 
?> 
WolvDev
  • 3,182
  • 1
  • 17
  • 32
  • i used the code above but i get the following error: Parse error: syntax error, unexpected T_BOOLEAN_AND, expecting ',' or ')' – PersianBoy67 Jul 06 '12 at 13:56
  • ok thanks a lot! now it works and the redirects works fine (from desktop to mobile) but when i click on full website link it creates a loop and goes back to mobile website. Show desktop website – PersianBoy67 Jul 06 '12 at 15:15
  • Seen a mistake in my code, Edited again :D in the 6th line of my code (below Modify here:) in the last $_SESSION I forgot ['device']. – WolvDev Jul 06 '12 at 15:19
  • do i need to have session_strat(); on the mobile site? i feel like the code doesn't recognize the session. it would still create a loop. – PersianBoy67 Jul 06 '12 at 16:03
  • yeah, you're right, you need to start a session on each site. – WolvDev Jul 06 '12 at 16:22