# Umleitung auf mobile Seite



## achterbahnfreak (20. Oktober 2011)

Hi,

ich suche einen (einfachen - wirklich einfachen) Php Code, der mir die Besucher auf meine Seite http://www.test.de/mobile umleitet, wenn sie ein mobiles Gerät besitzen. Ich habe schon gegoogelt, aber irgendwie verwirrt mich alles 
Hat jemand ne simple Lösung für mich, die ich in meine index.php einpacken könnte (besteht größtenteils aus HTML.

Danke


----------



## chmee (20. Oktober 2011)

Letztlich geht es darum, den Header abzufragen und danach zu entscheiden, ob Smartphone/Mobilgerät oder Desktop-System.

Hier ist ein wirklich einfaches Beispiel, wie es für iPhone aussieht
http://www.mobilewebdesign.de/?p=55

Über einen Einzeiler wirst Du es nicht hinbekommen, das sollte klar sein. Für die höchstmögliche Absicherung müsste man nach mehr als dem Header fragen, denn auch Mobilbrowser dürfen ihre wahre Identität verschleiern 
http://phpforum.de/forum/showthread.php?t=264692

mfg chmee


----------



## achterbahnfreak (20. Oktober 2011)

Bei diesem Code hier:



> <?php
> if(eregi(”iPhone”,$_SERVER[”HTTP_USER_AGENT”])){
> header(”Location: http://m.mwxp.de/iweiche/iphone.php”);



Reicht es wenn ich dann nach dem "iPhone" noch ,"Android","Windows" und so weiter hinzufüge?


----------



## chmee (20. Oktober 2011)

Nein. Hast Du den zweiten Link gestöbert?

mfg chmee


----------



## achterbahnfreak (20. Oktober 2011)

Ja, aber da blicke ich nicht ganz durch, weil ich null Php kann..


----------



## fpvz (20. Oktober 2011)

Du musst für jedes Device eine neue else-if-Bedingung setzen:


```
<?php
if(eregi(”iPhone”,$_SERVER[”HTTP_USER_AGENT”])){
header(”Location: http://m.mwxp.de/iweiche/iphone.php”);
} else if(eregi(”Android”,$_SERVER[”HTTP_USER_AGENT”])){
header(”Location: http://m.mwxp.de/iweiche/android.php”);
}
...
```

Beachte aber, dass eregi() seit PHP 5.3.0 DEPRECATED (also veraltet) ist, und es u.U. zu fehlern kommen kann..
Darum arbeite besser mit preg_match()...

```
if(preg_match(”iPhone”,$_SERVER[”HTTP_USER_AGENT”])){
header(”Location: http://m.mwxp.de/iweiche/iphone.php”);
} else if(preg_match(”Android”,$_SERVER[”HTTP_USER_AGENT”])){
header(”Location: http://m.mwxp.de/iweiche/android.php”);
}
...
```

Genauere Infos siehe hier


----------



## achterbahnfreak (20. Oktober 2011)

Supi  Und muss ich für jedes Betriebssystem oder jedes Handy ein device setzen?


----------



## fpvz (20. Oktober 2011)

Natürlich nicht, du kannst zum Abschluss der else-if-Bedingungen noch per

```
} else { header(”Location: http://m.mwxp.de/iweiche/normaleseite.php”); }
```

Einen Fallback für alle anderen Devices setzen.


----------



## achterbahnfreak (20. Oktober 2011)

Also passt das so? Funkitoniert es jetzt, dass ich mit einem Samsung Handy auf die mobile Seite umgeleitet werde?



> <?php
> if(preg_match(”iPhone”,$_SERVER[”HTTP_USER_AGENT”])){
> header(”Location:
> } else if(preg_match(”Android”,$_SERVER[”HTTP_USER_AGENT”])){
> ...


----------



## chmee (20. Oktober 2011)

Ok. Das war aus deiner Frage schon ersichtlich. Ich werd trotz Deines Wunsches nach eine kurzen und knappen Antwort, ein bisschen ausholen, wirst nicht der Einzige sein, der etwas dazu erfahren will 

Der Code sucht im Header, genauer, dem User-Agent nach dem Begriff iphone.

```
Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10
```
So sieht der User-Agent eines Firefox auf einem Windows-System aus.
Und darunter der Browser eines IPhone.

```
Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3
```



> And then Google built Chrome, and Chrome used Webkit, and it was like Safari, and wanted pages built for Safari, and so pretended to be Safari. And thus Chrome used WebKit, and pretended to be Safari, and WebKit pretended to be KHTML, and KHTML pretended to be Gecko, and all browsers pretended to be Mozilla, and Chrome called itself Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13, and the user agent string was a complete mess, and near useless, and everyone pretended to be everyone else, and confusion abounded.


http://webaim.org/blog/user-agent-string-history/

So  Sorry, abgeschweift. Nun zum php-Code. Die Abfrage mehrerer Begriffe müsste mit einem kombinierten logischen Oder gemacht werden, ob nun als php-code oder als Regexpattern.

Da ich keine Ahnung habe, wie sich die ganzen Geräte verhalten - und wieviel es sind, gebe ich Dir nur ein Beispiel für Android und Iphone, soweit einfach, dass Du selbst hinzufügen kannst, was benötigt wird - bisschen lesen wird aber wohl nötig sein..


```
<?php
$regex = "/(android|iphone)/i";
# getrennt durch den Strich 
preg_match ($regex, $_SERVER['HTTP_USER_AGENT'], $output);

if($output)
{
  header('Location: http://m.mwxp.de/mobil/index.php');
} else {
  header('Location: http://m.mwxp.de/index.php');
}
?>
```
Dass dies eben nicht immer zum Erfolg führt, sollte klar sein, wenn man sieht, wieviele verschiedene Kennungen für verschiedene Gerät/Browser-Kombinationen existieren. Deswegen gibt es Klassen, die einem das Tohuwabohu abnehmen. Siehe oben, zweiter Link oder Hier

mfg chmee


----------



## fpvz (20. Oktober 2011)

Ich bezweifle, dass du es so auslesen kannst, da der Useragent nicht der Hersteller ist, sondern das OS des Devices, im Falle von Samsung also Android oder BadaOS.


----------



## achterbahnfreak (20. Oktober 2011)

Würde es dann so gehen?



> <?php
> $regex = "/(android|iphone|blackberry|psp|opera mini|iris|3g_t|windows ce|opera mobi|windows ce; smartphone;|windows ce; iemobile|palm os|palm|hiptop|avantgo|plucker|xiino|blazer|elainemini 9.5|vx1000|lge |m800|e860|u940|ux840|compal|wireless| mobi|ahong|lg380|lgku|lgu900|lg210|lg47|lg920|lg840|lg370|sam-r|mg50|s55|g83|t66|vx400|mk99|d615|d763|el370|sl900|mp500|samu3|samu4|vx10|xda_|samu5|samu6|samu7|samu9|a615|b832|m881|s920|n210|s700|c-810|_h797|mob-x|sk16d|848b|mowser|s580|r800|471x|v120|rim8|c500foma:|160x|x160|480x|x640|t503|w839|i250|sprint|w398samr810|m5252|c7100|mt126|x225|s5330|s820|htil-g1|fly v71|s302|-x113|novarra|k610i|-three|8325rc|8352rc|sanyo|vx54|c888|nx250|n120|mtk |c5588|s710|t880|c5005|i;458x|p404i|s210|c5100|teleca|s940|c500|s590|foma|samsu|vx8|vx9|a1000|_mms|myx|a700|gu1100|bc831|e300|ems100|me701|me702m-three|sd588|s800|8325rc|ac831|mw200|brew |d88|htc\/|htc_touch|355x|m50|km100|d736|p-9521|telco|sl74|ktouch|m4u\/|me702|8325rc|kddi|phone|lg |sonyericsson|samsung|240x|x320|vx10|nokia|sony cmd|motorola|up.browser|up.link|mmp|symbian|smartphone|midp|wap|vodafone|o2|pocket|kindle|mobile|psp|tre)/i";
> # getrennt durch den Strich
> preg_match ($regex, $_SERVER['HTTP_USER_AGENT'], $output);
> ...


----------



## fpvz (20. Oktober 2011)

In dem Fall werden alle Devices, die in der Variable "$regex" stehen auf die index.php umgeleitet.

Das was du gerade machst ist einfach ins Blaue reinstechen, was dir so überhaupt nichts bringt. Beschäftige dich bitte nochmal damit, was im HTTP-Header (speziell User_Agent) alles mitgesendet wird, dann wird dir evtl. klarer, wie du verschiedene Devices unterscheiden kannst.


----------



## achterbahnfreak (20. Oktober 2011)

Diesen code 


```
require_once('mobile_device_detect.php');
$mobile = mobile_device_detect();
```

von http://detectmobilebrowsers.mobi/ wie binde ich den in emeine Seite ein? Einfach


```
<?php
require_once('mobile_device_detect.php');
$mobile = mobile_device_detect();
?>
```

oder geht das anders?


----------



## sheel (20. Oktober 2011)

Ja, so bindet man den ein.
Helfen wird das aber allein nichts.

Und bitte benutze die Codetags statt Quote.


----------



## achterbahnfreak (20. Oktober 2011)

Also ich habe den Code so in meine index eingefügt:


```
<?php
require_once('mobile_device_detect.php');
mobile_device_detect(true,false,true,true,true,true,true,'http://test/mobile',false);
?>
```

Außerdem die mobile_device_detect.php auf gleicher Ebene hochgeladen und dort in Zeile 165 die mobile Adresse angegeben:


```
// if redirect (either the value of the mobile or desktop redirect depending on the value of $mobile_browser) is true redirect else we return the status of $mobile_browser
  if($redirect = ($mobile_browser==true) ? $mobileredirect : $desktopredirect){
    header('Location: http://test.de/mobile/index.php'.$redirect); // redirect to the right url for this device
    exit;
  }else{
```

Aber auf meinem Samsung GT i9001 haut es folgende Fehlermeldung raus:



> Warning: Cannot modify header information - headers already sent by (output started at /var/www/web232/html/index.php:9) in /var/www/web232/html/mobile_device_detect.php on line 165



Was is falsch? :O


----------



## chmee (20. Oktober 2011)

Einen Header MUSS man am Anfang der Datei ändern, sprich, diese Befehle MÜSSEN als erstes geschehen. Keine Leerzeichen, keine Zeilen oder <html>-Anweisungen.

http://www.tippscout.de/php-fehlermeldung-headers-already-sent_tipp_3136.html

mfg chmee


----------



## achterbahnfreak (20. Oktober 2011)

Heißt das Script in der index kommt ganz an den Anfang und dann der <head> tag und so weiter?


----------



## Maniac (20. Oktober 2011)

Richtig, als aller erstes:

```
<?php

// dein umleitungscript
?>
<html>
.....
</html>
```


----------



## chmee (20. Oktober 2011)

Bitte frag doch nicht alles, sondern probier es aus. GANZ AN ANFANG - AN ANFANG!

mfg chmee


----------



## chmee (20. Oktober 2011)

AN DEN ANFANG AN DEN ANFANG AN DEN ANFANG.
Achterbahnfreak, bitte lies, was wir schreiben, und was andere Seiten kommentieren.

Um es Dir nochmal zu erklären:
Dieser Fehler tritt auf, wenn IRGENDEINE Ausgabe vor der Headeränderung getätigt wurde..

mfg chmee


----------



## achterbahnfreak (20. Oktober 2011)

Oke habe es jetzt ganz am Anfang:

Jetzt findet er des irgendwie net:

the request URL is not found /mobile/index.phphttp://test.de

Passen dfie Einstellungen von oben?


----------



## chmee (20. Oktober 2011)

Ja, dann soltest Du den Header anpassen, siehst Du nicht die falsche URL, die ausgespuckt wird?


----------



## achterbahnfreak (20. Oktober 2011)

In dem Header Code muss ich nur die URL einfügen, die auf die mobile Seite (aslo http://www.test.de/mobile(index.php) führt, richtig?
Und in der mobile_device_detect.php was muss ich da für eine URL bei Location angeben? Gar keine?


----------



## achterbahnfreak (20. Oktober 2011)

ES GEHT******************! DANKE************ DANKE************ Wirklich vielen Dank


----------

