DevProTalk

Forumi IT profesionalaca
web development, web design, e-business, SEO


Idite nazad   DevProTalk > Web development i web aplikacije > Regular expression i htaccess
Želite da se reklamirate ekskluzivno na ovoj poziciji? Javite se

Regular expression i htaccess regex, PCRE, POSIX, upotreba Apache .htaccess , mod_rewrite

Odgovori
 
Alati teme Način prikaza
Staro 18. 03. 2010.   #1
User
novi član
Na probnom radu
 
Avatar User
 
Datum učlanjenja: 04.11.2006
Lokacija: Beograd
Poruke: 22
Hvala: 5
9 "Hvala" u 5 poruka
User is on a distinguished road
Default 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);
To radi dobro sa TLD koji nemaju second level, jer odmah saznam da mi je $data[1] prazan, prependujem www i izvrsim redirekciju bez upita u bazu.

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?

Poslednja izmena od User : 18. 03. 2010. u 16:29.
User je offline   Odgovorite uz citat
Staro 18. 03. 2010.   #2
JovanT
profesionalac
Qualified
 
Datum učlanjenja: 11.01.2006
Lokacija: Niš
Poruke: 100
Hvala: 66
11 "Hvala" u 9 poruka
JovanT is on a distinguished road
Default

Мислим да нема потреба да се компликује оволико. Твоје потребе би могао да задовољи и обичан explode('.', $_SERVER['HTTP_HOST']);. Тиме ћеш добити све појединачне делове домена. Затим можеш да провераваш предзадњи део. Уколико је он нешто из опсега (co, its, in...), знаш да се ради о .ccTLD па сходно томе вршиш даље провере.

Ако ово није довољно поуздано, онда можеш да идеш обрнутом логиком - провераваш да ли се ради о интернационалном домену (com, net, org, info, eu, asia...). Ако јесте, третираш га на један начин, ако није - на други. Верујем да се све ово можеш решити уз неколико if-ова.
JovanT je offline   Odgovorite uz citat
Staro 18. 03. 2010.   #3
noviKorisnik
Dejan Katašić
Wrote a book
 
Avatar noviKorisnik
 
Datum učlanjenja: 10.06.2005
Lokacija: Novi Sad
Poruke: 1.017
Hvala: 129
86 "Hvala" u 43 poruka
noviKorisnik će postati "faca" uskoro
Default

To radi na nivou .htaccess, ne u PHP. Recimo ovako (brzi primer, hvala Google...
Kôd:
Options +FollowSymlinks
RewriteEngine on
rewritecond %{http_host} ^domain.com [nc]
rewriterule ^(.*)$ http://www.domain.com/$1 [r=301,nc]

Poslednja izmena od noviKorisnik : 18. 03. 2010. u 17:22.
noviKorisnik je offline   Odgovorite uz citat
Staro 18. 03. 2010.   #4
User
novi član
Na probnom radu
 
Avatar User
 
Datum učlanjenja: 04.11.2006
Lokacija: Beograd
Poruke: 22
Hvala: 5
9 "Hvala" u 5 poruka
User is on a distinguished road
Default

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).
User je offline   Odgovorite uz citat
Staro 18. 03. 2010.   #5
sinisabobic
član
Certified
 
Avatar sinisabobic
 
Datum učlanjenja: 14.08.2008
Lokacija: Beograd
Poruke: 73
Hvala: 60
173 "Hvala" u 16 poruka
sinisabobic is on a distinguished roadsinisabobic is on a distinguished road
Pošaljite ICQ poruku za sinisabobic Pošaljite poruku preko MSN za sinisabobic Pošaljite poruku preko Skype™ za sinisabobic
Default

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)
__________________
Celebrity Wallpapers / Male Wallpapers
sinisabobic je offline   Odgovorite uz citat
Staro 18. 03. 2010.   #6
sinisabobic
član
Certified
 
Avatar sinisabobic
 
Datum učlanjenja: 14.08.2008
Lokacija: Beograd
Poruke: 73
Hvala: 60
173 "Hvala" u 16 poruka
sinisabobic is on a distinguished roadsinisabobic is on a distinguished road
Pošaljite ICQ poruku za sinisabobic Pošaljite poruku preko MSN za sinisabobic Pošaljite poruku preko Skype™ za sinisabobic
Default

Ako je .htaccess u igri probaj nesto ovako
Kôd:
RewriteCond %{HTTP_HOST} !^(.*)\.([^\.]+)\.com$ [NC]
RewriteCond %{HTTP_HOST} ([^\.]+).com$ [NC]
RewriteRule ^(.*)$ http://www.%1.com/$1 [L,R=301]
pa ako ti to radi za sve com domainove smislicemo nesto i za ostale

UPDATE: ja koristim ovo za neke sajtove gde imam po 300+ domainova koji teraju isti kod
__________________
Celebrity Wallpapers / Male Wallpapers
sinisabobic je offline   Odgovorite uz citat
Staro 18. 03. 2010.   #7
bOkIcA
Bojan Abramovic
Professional
 
Datum učlanjenja: 17.01.2008
Lokacija: Novi Sad
Poruke: 232
Hvala: 30
47 "Hvala" u 30 poruka
bOkIcA će postati "faca" uskoro
Default

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.
bOkIcA je offline   Odgovorite uz citat
Staro 18. 03. 2010.   #8
bOkIcA
Bojan Abramovic
Professional
 
Datum učlanjenja: 17.01.2008
Lokacija: Novi Sad
Poruke: 232
Hvala: 30
47 "Hvala" u 30 poruka
bOkIcA će postati "faca" uskoro
Default

mikro vreme odvojih...
Mislim da bi ovako nesto radilo dovoljno brzo cak i na vecem broju domena.

PHP kôd:
$current_domain    "example.co.uk"//$_SERVER['HTTP_HOST']

$domains    = array('example.com',
                    
'example.co.uk',
                    
'nekidomen.com',
                    
'nekinas.iz.rs',
                    
'test.co.rs');

foreach(
$domains as $key=>$domain) {
    
$strpos strpos($current_domain$domain);
    if (
$strpos AND preg_match("/\.$domain$/"$current_domain)) {
        
$success TRUE;
        break;
    } elseif (
$strpos === AND preg_match("/$domain$/"$current_domain)) {
        
// redirection here...
        
exit("redirecting to www.{$domains[$key]}");
    }
}

if (!isset(
$success)) {
    exit(
'domain not exist');
}

echo 
"show content w/o redirection"
bOkIcA je offline   Odgovorite uz citat
Staro 18. 03. 2010.   #9
bluesman
Goran Pilipović
Sir Write-a-Lot
 
Avatar bluesman
 
Datum učlanjenja: 18.05.2005
Lokacija: Beograd
Poruke: 5.450
Hvala: 288
1.247 "Hvala" u 446 poruka
bluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušati
Pošaljite ICQ poruku za bluesman
Default

Biće bar 2000+ domena i broj raste vremenom ... već sada ih ima oko 300 a još nismo ni počeli.
__________________
Goran Pilipović a.k.a. Ugly Fingers Bradley f.k.a. bluesman
I don't always know what I'm talking about but I know I'm right!
bluesman je offline   Odgovorite uz citat
Staro 18. 03. 2010.   #10
bOkIcA
Bojan Abramovic
Professional
 
Datum učlanjenja: 17.01.2008
Lokacija: Novi Sad
Poruke: 232
Hvala: 30
47 "Hvala" u 30 poruka
bOkIcA će postati "faca" uskoro
Default

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.

Poslednja izmena od bOkIcA : 18. 03. 2010. u 20:54.
bOkIcA je offline   Odgovorite uz citat
Odgovori



Pravila pisanja
Možete ne započinjati nove teme
Možete ne slati odgovore
Možete ne slati priloge
Možete ne izmeniti svoje poruke
vB kôd je Uključen
Smajliji su Uključen
[IMG] kod je Uključen
HTML kôd je Isključen
Pogledajte forum

Slične teme
Tema Početna poruka teme Forum Odgovori Poslednja poruka
$_SERVER['REMOTE_ADDR'] prazan ? Ivan PHP 22 16. 03. 2010. 20:23
Koristiti $_SERVER['REQUEST_TIME'] vs time()? bluesman PHP 29 08. 11. 2009. 00:40
Ajax & cross-subdomain problemi bNasty (X)HTML, JavaScript, DHTML, XML, CSS 9 17. 01. 2007. 02:15
Prazan $_SERVER['HTTP_REFERER'] bluesman PHP 26 11. 11. 2005. 14:43
Virtuelni subdomain preko .htaccess bluesman Regular expression i htaccess 6 17. 06. 2005. 12:05


Vreme je GMT +2. Trenutno vreme je 00:44.


Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.
Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.