Redirection mobile à l’aide de htaccess

J’ai un site Web appelé

www.website.org

J’ai un site Web mobile appelé

m.website.org

Je veux utiliser un htaccess pour redirect automatiquement l’URL du site principal vers la version mobile.

Cependant, il existe un lien sur la version mobile qui renvoie au site principal appelé

www.website.org?noredirect=true

Lorsque je clique sur le logo de la page d’accueil du site Web, il est lié à

www.website.org

Je ne veux pas que l’utilisateur soit autorisé à revenir accidentellement sur le mobile en cliquant sur le logo de la page principale. Comment puis-je accomplir cela via htaccess sans JavaSCript.

Sinon, je suis ouvert aux options alternatives.

MODIFIER

Je pense que je vais actuellement l’utiliser pour détecter la redirection mobile via htaccess

 RewriteEngine On RewriteBase / RewriteCond %{HTTP_USER_AGENT} android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge\ |maemo|midp|mmp|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 [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^(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|e\-|e\/|\-[aw])|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|xda(\-|2|g)|yas\-|your|zeto|zte\-) [NC] RewriteRule ^$ http://m.website.com [R,L] 

J’ai testé des morceaux de ce qui suit, mais pas le jeu de règles complet dans son intégralité, donc si vous rencontrez des problèmes, faites-le moi savoir et je vais creuser un peu plus. Cependant, en supposant que tout soit correct, vous pourriez essayer quelque chose comme ceci:

 RewriteEngine On # Check if this is the noredirect query ssortingng RewriteCond %{QUERY_STRING} (^|&)noredirect=true(&|$) # Set a cookie, and skip the next rule RewriteRule ^ - [CO=mredir:0:%{HTTP_HOST},S] # Check if this looks like a mobile device # (You could add another [OR] to the second one and add in what you # had to check, but I believe most mobile devices should send at # least one of these headers) RewriteCond %{HTTP:x-wap-profile} !^$ [OR] RewriteCond %{HTTP:Profile} !^$ # Check if we're not already on the mobile site RewriteCond %{HTTP_HOST} !^m\. # Check to make sure we haven't set the cookie before RewriteCond %{HTTP:Cookie} !\smredir=0(;|$) # Now redirect to the mobile site RewriteRule ^ http://m.example.org%{REQUEST_URI} [R,L] 

La solution de Tim Stone est sur la bonne voie, mais sa réécrisortingce initiale et son nom de cookie dans la condition finale sont différents, et vous ne pouvez pas écrire et lire un cookie dans la même demande.

Voici le code de travail finalisé:

 RewriteEngine on RewriteBase / # Check if this is the noredirect query ssortingng RewriteCond %{QUERY_STRING} (^|&)m=0(&|$) # Set a cookie, and skip the next rule RewriteRule ^ - [CO=mredir:0:www.website.com] # Check if this looks like a mobile device # (You could add another [OR] to the second one and add in what you # had to check, but I believe most mobile devices should send at # least one of these headers) RewriteCond %{HTTP:x-wap-profile} !^$ [OR] RewriteCond %{HTTP:Profile} !^$ [OR] RewriteCond %{HTTP_USER_AGENT} "acs|alav|alca|amoi|audi|aste|avan|benq|bird|blac|blaz|brew|cell|cldc|cmd-" [NC,OR] RewriteCond %{HTTP_USER_AGENT} "dang|doco|eric|hipt|inno|ipaq|java|jigs|kddi|keji|leno|lg-c|lg-d|lg-g|lge-" [NC,OR] RewriteCond %{HTTP_USER_AGENT} "maui|maxo|midp|mits|mmef|mobi|mot-|moto|mwbp|nec-|newt|noki|opwv" [NC,OR] RewriteCond %{HTTP_USER_AGENT} "palm|pana|pant|pdxg|phil|play|pluc|port|prox|qtek|qwap|sage|sams|sany" [NC,OR] RewriteCond %{HTTP_USER_AGENT} "sch-|sec-|send|seri|sgh-|shar|sie-|siem|smal|smar|sony|sph-|symb|t-mo" [NC,OR] RewriteCond %{HTTP_USER_AGENT} "teli|tim-|tosh|tsm-|upg1|upsi|vk-v|voda|w3cs|wap-|wapa|wapi" [NC,OR] RewriteCond %{HTTP_USER_AGENT} "wapp|wapr|webc|winw|winw|xda|xda-" [NC,OR] RewriteCond %{HTTP_USER_AGENT} "up.browser|up.link|windowssce|iemobile|mini|mmp" [NC,OR] RewriteCond %{HTTP_USER_AGENT} "symbian|midp|wap|phone|pocket|mobile|pda|psp" [NC] RewriteCond %{HTTP_USER_AGENT} !macintosh [NC] # Check if we're not already on the mobile site RewriteCond %{HTTP_HOST} !^m\. # Can not read and write cookie in same request, must duplicate condition RewriteCond %{QUERY_STRING} !(^|&)m=0(&|$) # Check to make sure we haven't set the cookie before RewriteCond %{HTTP_COOKIE} !^.*mredir=0.*$ [NC] # Now redirect to the mobile site RewriteRule ^ http://m.website.com [R,L] 

J’ai modifié la solution de Tim Stone encore plus loin. Cela permet au cookie d’être dans 2 états, 1 pour mobile et 0 pour complet. Lorsque le cookie mobile est défini sur 0, même un navigateur mobile accède au site complet.

Voici le code:

  RewriteBase / RewriteEngine On # Check if mobile=1 is set and set cookie 'mobile' equal to 1 RewriteCond %{QUERY_STRING} (^|&)mobile=1(&|$) RewriteRule ^ - [CO=mobile:1:%{HTTP_HOST}] # Check if mobile=0 is set and set cookie 'mobile' equal to 0 RewriteCond %{QUERY_STRING} (^|&)mobile=0(&|$) RewriteRule ^ - [CO=mobile:0:%{HTTP_HOST}] # cookie can't be set and read in the same request so check RewriteCond %{QUERY_STRING} (^|&)mobile=0(&|$) RewriteRule ^ - [S=1] # Check if this looks like a mobile device RewriteCond %{HTTP:x-wap-profile} !^$ [OR] RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC,OR] RewriteCond %{HTTP:Profile} !^$ # Check if we're not already on the mobile site RewriteCond %{HTTP_HOST} !^m\. # Check to make sure we haven't set the cookie before RewriteCond %{HTTP:Cookie} !\mobile=0(;|$) # Now redirect to the mobile site RewriteRule ^ http://m.example.com%{REQUEST_URI} [R,L]  

Merci Tim Stone, naunu et Kevin Bond, ces réponses m’ont vraiment aidé. Voici mon adaptation de votre code. J’ai ajouté la fonctionnalité à redirect vers le site de bureau à partir de m.exemple.com au cas où l’utilisateur ne visiterait pas le site avec un appareil mobile. De plus, j’ai ajouté une variable d’environnement pour préserver les requêtes http / https:

 # Set an environment variable for http/https. RewriteCond %{HTTPS} =on RewriteRule ^(.*)$ - [env=ps:https] RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ - [env=ps:http] # Check if m=1 is set and set cookie 'm' equal to 1. RewriteCond %{QUERY_STRING} (^|&)m=1(&|$) RewriteRule ^ - [CO=m:1:example.com] # Check if m=0 is set and set cookie 'm' equal to 0. RewriteCond %{QUERY_STRING} (^|&)m=0(&|$) RewriteRule ^ - [CO=m:0:example.com] # Cookie can't be set and read in the same request so check. RewriteCond %{QUERY_STRING} (^|&)m=0(&|$) RewriteRule ^ - [S=1] # Check if this looks like a mobile device. RewriteCond %{HTTP:x-wap-profile} !^$ [OR] RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC,OR] RewriteCond %{HTTP:Profile} !^$ # Check if we're not already on the mobile site. RewriteCond %{HTTP_HOST} !^m\. # Check if cookie is not set to force desktop site. RewriteCond %{HTTP_COOKIE} !^.*m=0.*$ [NC] # Now redirect to the mobile site preserving http or https. RewriteRule ^ %{ENV:ps}://m.example.com%{REQUEST_URI} [R,L] # Check if this looks like a desktop device. RewriteCond %{HTTP_USER_AGENT} "!(android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile)" [NC] # Check if we're on the mobile site. RewriteCond %{HTTP_HOST} ^m\. # Check if cookie is not set to force mobile site. RewriteCond %{HTTP_COOKIE} !^.*m=1.*$ [NC] # Now redirect to the mobile site preserving http or https. RewriteRule ^ %{ENV:ps}://example.com%{REQUEST_URI} [R,L] 

Cela semble fonctionner correctement sauf une chose: lorsque je suis sur le site de bureau avec un périphérique de bureau et que je visite m.exemple.com/?m=1, je suis redirigé vers exemple.com. Quand j’essaye encore, je rest à m.example.com. Il semble que le cookie ne soit pas défini et / ou lu correctement la première fois.

Peut-être y a-t-il un meilleur moyen de déterminer si le périphérique est un périphérique de bureau, j’ai simplement annulé la détection du périphérique par le haut.

Et je me demande si de cette façon tous les appareils mobiles sont détectés. Dans le code de Tim Stone et de Naunu, cette partie est beaucoup plus grande.

De même, si vous souhaitez redirect vers un sous-dossier au lieu d’un sous-domaine, procédez comme suit:

En travaillant avec la bonne solution de Kevin, vous pouvez l’append au fichier .htaccess du répertoire racine de votre site:

   RewriteBase / RewriteEngine On # Check if mobile=1 is set and set cookie 'mobile' equal to 1 RewriteCond %{QUERY_STRING} (^|&)mobile=1(&|$) RewriteRule ^ - [CO=mobile:1:%{HTTP_HOST}] # Check if mobile=0 is set and set cookie 'mobile' equal to 0 RewriteCond %{QUERY_STRING} (^|&)mobile=0(&|$) RewriteRule ^ - [CO=mobile:0:%{HTTP_HOST}] # cookie can't be set and read in the same request so check RewriteCond %{QUERY_STRING} (^|&)mobile=0(&|$) RewriteRule ^ - [S=1] # Check if this looks like a mobile device RewriteCond %{HTTP:x-wap-profile} !^$ [OR] RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC,OR] RewriteCond %{HTTP:Profile} !^$ # Check if we're not already on the mobile site RewriteCond %{HTTP_HOST} !^m\. # Check to make sure we haven't set the cookie before RewriteCond %{HTTP:Cookie} !\mobile=0(;|$) # Now redirect to the mobile site RewriteRule ^ http://www.mysite.com/m/ [R]  

Ensuite, dans le dossier /m/ , ajoutez ou créez un fichier .htaccess avec les éléments suivants:

  #Begin user agent loop fix RewriteEngine Off RewriteBase / #End user agent loop fix 

Je sais que ce n’est pas une réponse directe à la question, mais quelqu’un (comme moi) pourrait trébucher sur cette question et se demander comment cette méthode serait également appliquée.

Pour les mobiles comme domain.com/m/

 RewriteCond %{HTTP_REFERER} !^http://(.*).domain.com/.*$ [NC] RewriteCond %{REQUEST_URI} !^/m/.*$ RewriteCond %{HTTP_USER_AGENT} "android|blackberry|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC] RewriteRule ^(.*)$ /m/ [L,R=302] 

Tout d’abord, accédez à l’URL suivante et téléchargez le fichier mobile_detect.php:

http://code.google.com/p/php-mobile-detect/

Insérez le code suivant dans votre index ou votre page d’accueil:

 isMobile() && isset($_COOKIE['mobile'])) { $detect = "false"; } elseif ($detect->isMobile()) { header("Location:http://www.yourmobiledirectory.com"); } ?> 

Vous pouvez également essayer ceci. Crédits à l’auteur original qui a depuis supprimé le script

/mobile.class.php

 0) { header("location: $mobile"); exit; } } ?> 

Modifiez simplement le $mobile = "http://www.stepforth.mobi";

Ou vous pouvez essayer ceci:

 ?php /** * Mobile Detect * @license http://www.opensource.org/licenses/mit-license.php The MIT License */ class Mobile_Detect { protected $accept; protected $userAgent; protected $isMobile = false; protected $isAndroid = null; protected $isAndroidtablet = null; protected $isIphone = null; protected $isIpad = null; protected $isBlackberry = null; protected $isBlackberrytablet = null; protected $isOpera = null; protected $isPalm = null; protected $isWindows = null; protected $isWindowsphone = null; protected $isGeneric = null; protected $devices = array( "android" => "android.*mobile", "androidtablet" => "android(?!.*mobile)", "blackberry" => "blackberry", "blackberrytablet" => "rim tablet os", "iphone" => "(iphone|ipod)", "ipad" => "(ipad)", "palm" => "(avantgo|blazer|elaine|hiptop|palm|plucker|xiino)", "windows" => "windows ce; (iemobile|ppc|smartphone)", "windowsphone" => "windows phone os", "generic" => "(kindle|mobile|mmp|midp|pocket|psp|symbian|smartphone|treo|up.browser|up.link|vodafone|wap|opera mini)"); public function __construct() { $this->userAgent = $_SERVER['HTTP_USER_AGENT']; $this->accept = $_SERVER['HTTP_ACCEPT']; if (isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE'])) { $this->isMobile = true; } elseif (strpos($this->accept, 'text/vnd.wap.wml') > 0 || strpos($this->accept, 'application/vnd.wap.xhtml+xml') > 0) { $this->isMobile = true; } else { foreach ($this->devices as $device => $regexp) { if ($this->isDevice($device)) { $this->isMobile = true; } } } } /** * Overloads isAndroid() | isAndroidtablet() | isIphone() | isIpad() | isBlackberry() | isBlackberrytablet() | isPalm() | isWindowsphone() | isWindows() | isGeneric() through isDevice() * * @param ssortingng $name * @param array $arguments * @return bool */ public function __call($name, $arguments) { $device = substr($name, 2); if ($name == "is" . ucfirst($device) && array_key_exists(strtolower($device), $this->devices)) { return $this->isDevice($device); } else { sortinggger_error("Method $name not defined", E_USER_WARNING); } } /** * Returns true if any type of mobile device detected, including special ones * @return bool */ public function isMobile() { return $this->isMobile; } protected function isDevice($device) { $var = "is" . ucfirst($device); $return = $this->$var === null ? (bool) preg_match("/" . $this->devices[strtolower($device)] . "/i", $this->userAgent) : $this->$var; if ($device != 'generic' && $return == true) { $this->isGeneric = false; } return $return; }