Subdomain iz $_SERVER['HTTP_HOST']
Aplikacija prikazuje sadržaj na osnovu domena na kome se servira (uključujući i poddomen). Jedni podaci se prikazuju za www.domain.com, drugi za dev.domain.com, treći za test.domain.com i tako dalje.
Pokušavam da rešim sledeći problem: automatski izvršiti redirekciju na www poddomen ukoliko korisnik dođe na domen bez ikakvog poddomena. Na praktičnom primeru: 1) korisnik je došao na example.com => izvrsiti redirekciju na www.example.com 2) korisnik je došao na test.еxample.com (ili www.example.com ili dev.example.com) => ne menjati ništa Trenutno radim preg_match nad $_SERVER['HTTP_HOST']: Kôd:
preg_match ("%^(?:([A-Za-z0-9\-_]+)\.)?([^/.]+)\.([^/:]+)(\:[0-9]+)?%i", $_SERVER['HTTP_HOST'], $data); Problem nastaje sa raznim ccTLD i second level TLD, kao sto su .co.uk ili .com.br - tada sam primoran da vršim upite u bazu što želim da izbegnem. Uzmimo za primer da korisnik dolazi na example.co.uk, a da se aplikacija servira sa www.example.co.uk. Trenutni regex ce vratiti: $data[1] = 'example'; $data[2] = 'co'; $data[3] = 'uk'; Tj dobiću da je pronađen subdomain 'example'. Potom vršim upit u bazu po domenu 'example.co.uk'. Ukoliko ne dobijem rezultat, pokušavam sa 'www.example.co.uk'. Tim upitom nalazim domen i vršim redirekciju. U slučaju da ni 'www.example.co.uk' domen nije nađen u bazi, izvrsiću redirekciju na neki treći domen, ali to je trenutno manje bitno. Ima li neko bolju ideju kako bolje razrešiti ovaj problem? |
Мислим да нема потреба да се компликује оволико. Твоје потребе би могао да задовољи и обичан explode('.', $_SERVER['HTTP_HOST']);. Тиме ћеш добити све појединачне делове домена. Затим можеш да провераваш предзадњи део. Уколико је он нешто из опсега (co, its, in...), знаш да се ради о .ccTLD па сходно томе вршиш даље провере.
Ако ово није довољно поуздано, онда можеш да идеш обрнутом логиком - провераваш да ли се ради о интернационалном домену (com, net, org, info, eu, asia...). Ако јесте, третираш га на један начин, ако није - на други. Верујем да се све ово можеш решити уз неколико if-ова. |
To radi na nivou .htaccess, ne u PHP. Recimo ovako (brzi primer, hvala Google...
Kôd:
Options +FollowSymlinks |
To nije resenje. Evo vise primera:
www.domain.com ne menjati primer.domain.com ne menjati drugi.domain.com ne menjati domain.com se menja u www.domain.com www.domain232.com.br ne menjati primer.domain32423.com.br ne menjati example2323.com.br se menja u www.example2323.com.br Nije mi bilo u planu da za svaki domen koji se kreira pravim novu liniju u .htaccess fajlu. Ja ne znam na kom ce (pod)domenu korisnici pokretati applikaciju. Oni najcesce imaju *.domain.com => domain.com alias. Aplikacija se servira sa jednog (ili vise) njihovih poddomena (ne domena bez poddomena) - to je obicno www.domain123.com ali moze da bude bilosta.domain123.com (kao i bilo koji drugi TLD). |
Imao sam slican problem (sa jedinom razlikom da su mi trebali domainovi kod kojih se znalo da je SDL veci od 3). Problem je resen na sledeci nacin:
explode-ujes po "." onda proveravam po broju clanova u dobijenom nizu ukoliko je 2 to je domain formata example.com ukoliko je 3 onda se proverava srednji clan, pa ako je on manji ili jednak 3 onda je to formata example.co.uk npr a ako nije onda je to formata nesto.example.com a sve ostalo je formata nesto.example.co.uk (ne znam koji su detalji, ali ovo je meni resavalo sve sto mi je trebalo za tu situaciju) |
Ako je .htaccess u igri probaj nesto ovako
Kôd:
RewriteCond %{HTTP_HOST} !^(.*)\.([^\.]+)\.com$ [NC] UPDATE: ja koristim ovo za neke sajtove gde imam po 300+ domainova koji teraju isti kod |
Ako sam dobro skapirao radi se o aplikaciji koja "tera" vise domena.
U tom slucaju bih generisao (array) listu domena pri svakoj promeni u bazi, dalje bi se prema tome radila provera i redirekcija. |
mikro vreme odvojih...
Mislim da bi ovako nesto radilo dovoljno brzo cak i na vecem broju domena. PHP kôd:
|
Biće bar 2000+ domena i broj raste vremenom ... već sada ih ima oko 300 a još nismo ni počeli.
|
Na 50.000 domena u array-u vreme prolaska kroz petlju je na mom racunaru 0.035 sec.
A verujem da sigurno moze jos da se optimizuje. |
Dodavanje jednog IF-a i vreme prolaska kroz petnju (na tih 50.000 stavki u array-u) je sada ~ 0.027 sec.
PHP kôd:
|
na 2.000 domena...
~ 0.00103402137756 seconds |
Kod svih merenja traženi domen je bio na kraju array-a... ukoliko se domen nalazi na nekom drugom mestu iz petlje se, naravno, izlazi ranije.
|
Hvala na trudu i svemu, ali meni je neprihvatljivo rešenje da držim niz od 2000+ domena i radim foreach na svakom page view. Onda ću rađe da napravim jedno opšte pravilo koje važi za većinu a samo izuzetke da tretiram drugačije.
|
Ok, kapiram.
Ovo je bila samo jedna od "mehničkih" ideja. I btw. zašto ima potrebe da se na svaki prikaz radi takva provera? Nije li dovoljno samo jednom pa to zapisati u session i koristiti? laku noć :) |
Zato što je to prvo što se izvršava, pre svega ... neću da učitavam stranu do pola da bih shvatio da moram da radim redirekciju... ako ću tako, onda mogu i da koristim ovo tvoje rešenje :)
Hoću da izbegnem htaccess da mi ne bi radio rulove za svaki request. Hoću da izbegnem čitanje iz baze po svaku cenu. |
Na datom linku se nalazi bibliteka/funkcije za dobijanje registrovanog domena
http://www.dkim-reputation.org/regdom-libs/ ako imate registrovani domen, onda poddomen nije tesko pronaci. |
Nije potreban nikakav niz niti DNS lookup.
ccTLD domen ima maksimalno dva karaktera. Ispred ta dva karaktera ide do cetri znaka tipa info, co, com, biz itd (izvor http://www.entorno.es/dominios_terri...php?idioma=eng) Ja sam pronasao da je info jedini sa cetiri karaktera (U .info.tr), eventualno postoji jos neki koji bi bilo potrebno dodati. Sledeci kod bi trebalo da prepoznaje sve vrste domena i poddomena, eventualno je potrebna mala modifikacija za jos neki ccTLD koji nisam pronasao. PHP kôd:
Kôd:
www.domain.com |
|
^ onda tu TLD listu da drzite u multidimenzijalnom array-u, lol opet ja i array :D ;)
Aj kad dodjete do nekog resenja da ga objavite ovde, ako ne bude problem. |
1 Prilog(a)
Citat:
|
Ja sam uspeo da odradim ovo na nivou web server-a jedan virtual host sa rewrite-om na osnovu toga da li postoji fajl u document_root/domains/imedomena
Posto je vec receno da u bazi drzite imena domena za koje ce raditi aplikacija, prilikom dodavanja, brisanja domena potrebno je i dodati i obrisati fajl u domains/ime_domena. Tipa ako zelimo da nam aplikacija radi za example.com, samo cu touch-ovati taj fajl: Kôd:
touch domains/example.com Kôd:
set $postoji 0; A sve to zajedno za catchall virtual host bi izgledalo ovako: Kôd:
server { |
Tnx, ali kod nas svi domeni pucaju na isti docroot. Mada nekako mi je nesigurno da se jedna stvar oslanja na drugu nezavisnu stvar računajući da će sve da bude kako je "logično".
|
pa da radi sve za isti document root
|
Document Root je u:
Kôd:
root /Users/dejanr/Sites/dpt; Kôd:
# ako fajl postoji vrati ga odmah i prekini konekciju |
Vreme je GMT +2. Trenutno vreme je 21:51. |
Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.