php 从手机版切换到完整网站(桌面版)

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11314944/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 00:15:27  来源:igfitidea点击:

Switch From Mobile Version to Full Website (Desktop Version)

phpmobile

提问by PersianBoy67

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.

我想让用户可以选择从移动网站切换回桌面版本,但此代码会将他们重定向回移动网站。我想知道是否可以创建一个 if 语句来强制浏览器停留在该页面上。例如,如果我可以使用 www.mywebsite.com?device=desktop 从移动网站链接回来并修改代码以识别 url。我对 PHP 的了解有限,因此将不胜感激任何帮助。

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 postwas able to solve the issue. Below is the code i'm using.

** 我改用 cookie 并在这篇文章的帮助下解决了这个问题。下面是我正在使用的代码。

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

** 注意:您可以根据自己的需要修改setcookie的检测代码和时间

    <?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

您可以使用此代码来创建 cookie

<?php 
setcookie('nomobile', 'true');
   header('Location: http://yourwebsite.com');
?>

回答by David Jones

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:

当用户单击“完整站点”链接时,您可以通过将变量附加到 URL 来将变量传递给 PHP。下面是 HTML 链接在移动网站上的外观示例:

<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 isset, then you need to check whether or not it is set to 'desktop'. If both are true, then you should set a sessionvariable so that if the user refreshes the page they won't be redirected to the mobile site again.

在 PHP 中,你传入的变量将被存储在$_GET['v']('v' 代表版本,但命名是任意的)。在您的 PHP 代码中,您首先需要检查是否$_GET['v']甚至设置了。如果它设置,那么你需要检查它是否被设置为“桌面”。如果两者都为真,那么您应该设置一个会话变量,以便在用户刷新页面时他们不会再次重定向到移动站点。

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 notset, then you should redirect the user. If it isset, then you need to check whether or not it is set to 'desktop'. If it is notset to 'desktop', then you should redirect the user. Here's what the code would look like:

现在您需要检查会话变量以查看是否应该重定向用户。同样,您需要首先检查是否$_SESSION['v']已设置。如果设置,则应重定向用户。如果它设置,那么你需要检查它是否被设置为“桌面”。如果它没有设置为“桌面”,那么你应该重定向用户。下面是代码的样子:

// 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 eachpage 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.

PHP 的优点之一是它会为您处理会话,但您必须明确告诉 PHP 这样做。您可以使用需要成为会话一部分的每个页面session_start()顶部的函数来执行此操作。在这种情况下,您需要在桌面站点页面和移动站点页面的顶部添加一条语句。session_start()

回答by WolvDev

<?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.

使用 $_GET 您可以获取 query_string 中的变量(带有 url 的 ?hello=foo&bar=world)。使用 $_GET['device'] 您可以明确使用 ?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):

编辑:为了改善这一点,您可以将 GET 存储在 SESSION 变量中(会话将在您打开页面时启动,并且仅在您关闭浏览器时才会删除):

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'); 
?>