utorok 30. júna 2015

Htaccess a redirect na mobilné telefóny a tablety

Jedna z obľúbených tém je hľadať spôsoby "ako sa to nedá" urobiť. Ja vám ponúkam riešenie ako sa to dá a jednoducho. Samozrejme aj s pár fintami pokiaľ máte ssl certifikát nie na celej doméne ale len na určitom priečinku v doméne. Lebo aj to je možné, mať ssl certifikát len pre povedzme "platby" a nie na doméne.

Síce je DOMContentLoad 87 ms aj tak si stále myslím že je to ešte priveľa a aj 226 ms pre celkový load.


Takže začal by som tam kde je to na začiatok dôležité:

RewriteRule ^nazovpriecinku - [L]
Ako pravidlo napovedá, "všetky ostatné napísané pravidlá v .htaccess sa nevzťahujú na tento priečinok" a presmerovania sa tohoto priečinka nedotknú. Rewrite pravidlo treba umiestniť nad pravidlom presmerovania. Nazvime to, že v takomto tvare má priečinok "imunitu".

Samotné presmerovanie na mobilnú subdoménu predchádza vybudovanie vytvorením subdomény v tvare: m.subdomena samozrejme v tvare http protokolu. Je zbytočné vytvárať www. Potom do subdomény treba nakopírovať kópiu všetkého čo sa nachádza na doméne.
Sadnite si, to nie je všetko! Samozrejme potom treba trocha skúseností s prepísaním scriptov aby sa stránky webu dobre a vhodne zobrazovali v malých mobilných zariadeniach. Čiže treba vytvoriť responzívny dyzajn pre celý web. Keď to už je vytvorené, môžeme začať písať do hlavného htaccess súboru (na hlavnej doméne) pravidlo k presmerovaniu návštevníkov ale aj množstva robotov smerom na subdoménu. Roboti a booti pochopia že subdoména je určená vyložene pre malé zariadenia a preto sa v serpe objaví subdoména používaná mobilnými prehliadačmi. Samotné presmerovanie u mňa funguje takto:

RewriteCond %{HTTP:x-wap-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]
RewriteRule ^ http://m.subdoména.nieco%{REQUEST_URI} [R,L]

V Logu sa potom dočítate ako roboti narábajú so zápisom na presmerovanie takto:

141.0.14.XXX - - [30/Jun/2015:23:36:37 +0200] "GET / HTTP/1.0" 302 506 "-" "Opera/9.80 (Android; Opera Mini/7.6.40234/36.2464; U; sk) Presto/2.12.423 Version/12.16"
141.0.14.XXX - - [30/Jun/2015:23:36:37 +0200] "GET / HTTP/1.0" 200 3009 "-" "Opera/9.80 (Android; Opera Mini/7.6.40234/36.2464; U; sk) Presto/2.12.423 Version/12.16"
Požiadavka GET na www bola zmenená presmerovaním 302 a odpoveď na presmerovanie je 200, "čiže takto je to formulované správne a perfektne zapísané do htaccess súboru". Môžete použiť aj takýto záverečný "direkt" aj keď zastávam názor že url adresy by nemali byť smerované na jednu adresu URL:

RewriteRule ^ http://m.subdoména.nieco [R,L]

V takomto prípade ide všetko presmerovanie na index domény. Technicky vzaté: vo vyhľadávačoch sa občas nájdu linky na adresy s www a preto by ich "malo viesť presmerovanie na požiadavku URI" a nie na index webu subdomény. Potom sa vám nestane taký "zádrhel" že by robot googla idexoval napríklad sitemap.xml a redirect by ho poslal na index subdomény! Samozrejme dá sa to ďalšími pravidlami ošetriť, ale načo keď je to pohodlnejšie jednoduchým zápisom.Tu je príklad z logu:

66.249.67.79 - - [30/Jun/2015:13:22:09 +0200] "GET /sitemap.html HTTP/1.0" 302 524 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.67.106 - - [30/Jun/2015:13:22:10 +0200] "GET /sitemap.html HTTP/1.0" 200 2435 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Presne toto sa stáva často a potom sa divíme, že nám weby neslúžia ako my chceme. Nemali by ste zabudnúť že m.subdomena.nieco má mať svoje sitemapy a tie treba tiež poprepisovať. No a keďže sme pri mobilných aplikáciách mať sitemap.xml nestačí! Verzie mobilných prehľadávačov majú radšej verziu sitemap.gz a tiež súčasne aj sitemap.xml.gz. Tu je názorná ukážka:

66.249.67.67 - - [30/Jun/2015:14:02:04 +0200] "GET /sitemap.xml.gz HTTP/1.0" 200 2220 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

Zabaliť môžete aj urllist.txt na urllist.gz či txt.gz lebo všetko čo je zmenšené majú roboti radi.

Ak máte dáke fígle a triky píšte posty, rád sa zdokonalím a aj čitatelia budú radi každej tvorivej možnosti.