23.10.2009

Altan Tanrıverdi | Popüler, Yazılım | 27 yorum

Otomatik Subdomain Yaratma

Otomatik Subdomain Yaratma

Subdomain yaratma konusunda gelen taleplere cevaben hazırladığım kısa notları paylaşayım.

İlk olarak .htaccess ile çözüm: Bu tür çözümü yönlendirmeler için kullanıyoruz. Aslında yarattığımız bir subdomain bulunmuyor:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^([^\.]+)\.site\.net$ [NC]
RewriteCond %1 !^(www|ftp|mail)$ [NC]
RewriteRule ^.*$ profil.php?kullaniciadi=%1 [L]

Bu kod ile örneğin http://altan.site.com adresine gelecek talep, http://www.site.net/profil.php?kullaniciadi=altan adresine yönlendirilecektir. Böylece uzun ve şık durmayan urllerden kurtulmuş olacağız. Not: wildcard DNS host servisiniz tarafından aktif edilmiş olmalıdır. ^(www|ftp|mail) ifadeside yönlendirilmeyecek gerçek subdomainleri yazacağınız bölüm.

İkici yolumuz PHP. Sadece cPanel kullanılan sistemlerde çalışır. Bu kod ile hem subdomaini yaratıyor hemde public_html (veya www) klasörümüzde subdomain ile aynı ada sahip bir klasör yaratıyoruz. Subdomain de bu klasöre otomatik yönlendirilmiş oluyor.

// Yaratılacak altalanadları (subdomainler)
$altalan_dizi = array('istanbul', 'ankara', 'izmir', 'adana', 'mersin');

// Url
$url = "site.com";

// cPanel Bilgileri
$kullanici_adi = 'kullanici';
$parola = 'parola';
$sablon = 'rvblue';

Türkçe cpaneller genelde rvblue’dür ancak ingilizce ise genellikle x veya x3 kullanılır. Tam olarak öğrenmek için cPanelinize giriniz ve urlde frontend/ ifadesinden sonra ne yazdığına bakınız. Koda devam edelim:

foreach($altalan_dizi as $altalan) {
$talep = "/frontend/$sablon/subdomain/doadddomain.html?domain=$altalan&rootdomain=$url";
$sonuc = yarat($kullanici_adi,$parola,$talep);
echo $goster = strip_tags($sonuc);
}

Scriptlerinizde echo yaptırmayın. Çalışıp çalışmadığının kontrolü için eklendi. Koda devam edelim:

function yarat($xkullanici_adi,$xparola,$xtalep) {
$soket = fsockopen('localhost',2082);   if(!$soket) {
print('Soket hatası');
exit();
}

$yetki = "$xkullanici_adi:$xparola";
$sifre = base64_encode($yetki);
$basla = "GET $xtalep\r\n";
$basla .= "HTTP/1.0\r\n";
$basla .= "Host:localhost\r\n";
$basla .= "Authorization: Basic $sifre\r\n";
$basla .= "\r\n";
fputs($soket, $basla);
while (!feof($soket)) {
$xsonuc .= fgets ($soket,128);
}
fclose($soket);
return $xsonuc;
}

Herşey yolunda gittiyse aşağıdakine benzer bir çıktı almış olmalısınız:

Subdomain çıktısı

Kontrol edelim:

Altalanadları başarıyla yaratıldı

Görüldüğü gibi altalanadları başarıyla yaratılmış durumda.

HATALAR ve ANLAMLARI:

HTTP/1.1 401 Access Denied Still Working WWW-Authenticate: Basic realm="cPanel" Connection: close Set-Cookie: logintheme=cpanel; path=/ Set-Cookie: cprelogin=no; path=/ Set-Cookie: cpsession=closed; path=/ Server: cpsrvd/11.24 Content-type: text/html cPanel® 11 Login   Username Password © cPanel, Inc. 2006-2008

Yukarıdakine benzer hata alıyorsanız; cPanel kullanıcı adınızı veya parolanızı yanlış girdiniz demektir.

Warning: fsockopen() [function.fsockopen]: unable to connect to localhost:2082 (Connection refused) in /var/www/subdomain.php on line 21
Soket hatası

yukarıdakine benzer hata alıyorsanız; host adını veya port numarasını yanlış girdiniz demektir.

HTTP/1.1 404 Not Found Server: cpsrvd/11.24 Connection: close Content-type: text/html 404 Not Found Not Found The server was not able to find the document (./ ) you requested. Please check the url and try again. You might also want to report this error to your web hosting provider. cpaneld/11.24 Server at localhost

Yukarıdakine benzer hata alıyorsanız; host adını veya şablon adını (rvblue, x, x3) yanlış girmişsiniz demektir.

Kodu indirmek için tıklayınız!

  1. hocam benim de çok iyi bir projem var ama bu wildcard ayarları icin hosting sirketleri hosting kadar para istiyor..ücretsiz yapan bir yer tanıyormusunuz?

    • Altan Tanrıverdi diyor ki:

      Göreceli büyük projelerde sunucu yönetiminin sizde olması gerekir. Paylaşımlı host ve/ya vps gibi sistemlerde wildcard dolayısıyla subdomain vs. kısıtlaması olabiliyor. Açıkcası dedicated/co-location harici bunun ücretsiz sunulacağını sanmıyorum.

      Bu konuda hostbul.net gibi ortamlar yardımcı olabilir.

  2. evet ama açıkcası ilk aylar bir hostta başlamayı düşünüyordum malumunuz fazla trafik olmuyor..tutması garanti degil vs :) bir de sunucu kiralamayalım

  3. bu arada bir arkadaşım hostgatoru onerdi sunucu icin öneriniz var mı?

    • Altan Tanrıverdi diyor ki:

      Siteniz biraz popüler olmaya başladığında inode problemi yaşarsınız. Özel olarak bir yer tavsiye edemem ama herhangi bir hosting firmasını incelediğinizde “…. sucks” diye aramanız o firma hakkında olumsuz görüşlere ulaşmanızı sağlar.

  4. ben bu wildcard’ı anlamadım? Benim hostingin cpanel’inde böyle bişe yok. Çok baktım. Pro bölümünde de yok. Hatta ilk defa duyuyorum diyebilirim. Şu subdomain’in biraz daha kolay ve çok özellik gerektirmeyen bir yöntemi yok mu? En azından her subdomaini örn: kafadanattim.307net.com’u 307net.com’a yönlendirebilmeyi anlatsanız hallederim. Çünkü http://www.307net.com ile bir kez denedim: “subdomain: www” yazısını çıkrtmayı başardım.

  5. @MOF zaten daha ilk blokta o anlatılmış, ilgili apache configini açacak, vhost u bulacak ve rewrite ruleları, Altan’ın verdiği gibi ayarlayacaksın.

    Tabii şuna daha çok benzeyecek:

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^([^\.]+)\.site\.net$ [NC]
    RewriteCond %1 !^(www)$ [NC]
    RewriteRule ^.*$ http://www.site.net$1 [R,L]

    Hani arayan soran olursa, hazır elimin altındayken lighttpd için olanı:

    $HTTP["host"] =~ “^(.*\.|)site\.com” {
    url.redirect = (
    “(.*)” => “http://www.site.com$1″,
    )
    }
    $HTTP["host"] =~ “^www\.site\.com” {

    }
    $HTTP["host"] =~ “^yonlenmesin\.site\.com” {

    }

    • yani illa apache config dosyasını mı düzenliyecez. O zaman bunu her web hosting sahibi yapamaz. Benimki normal host. İçinde Apache dosyalarını düzenleyebileceğim bir alan yok. Acaba bu dosyayı düzenlemeden yapılabilir mi? Yada PHP.INI dosyası gibi apache’nin de dosyasının istediğimiz bölümlerini yazsak öyle hosta atsak çalışır mı?

      • Altan Tanrıverdi diyor ki:

        Apache config (httpd.conf) değil .htaccess dosyasına ekleyeceksin. Root üzerinde yoksa manuel yaratabilirsin.

      • yaptım hem easyphp ile hem de gerçek hostta denedim olmuyor. test.307net.com açmaya çalıştığımda sayfa gelmiyor. Explorer hata veriyor. Çalışan bir örnek site verebilir misiniz?

      • Altan Tanrıverdi diyor ki:

        @MOF yazıda verilen ilk kod çalışan bir örnektir. Diğer taraftan panelim var demişsin. Şu yöntemi izleyebilirsin: Subdomains bölümüne giriş yapıp, subdomaini yazdıktan sonra “Document Root” un otomatik belirlediğini göreceksin. Senin örneğinde “test.307net.com” girdiğinde Document Root “/public_html/test” benzeri bir değer alacaktır. Sondaki “/test” i silmen yeterli olacaktır.

      • “Home Directory” değerinde dediğiniz gibi bir değer var fakat düzenlenmiyor. peki onu nasıl sileceğimi de söylerseniz tamamdır. :D Çünkü bunu düzenlemek için bir yer konulmamış yada engellenmiş.

      • Altan Tanrıverdi diyor ki:

        “Home Directory” diye bir değerden bahsetmedim, hangi versiyonu kullanıyorsunuz bilmiyorum ama “Document Root” olmalı. Yazı içinde panelin ekran görüntüsü var.

  6. Merhaba Altan hocam,

    DNS Wildcard sistemlerini aktif ettim sanırım.

    benim rewrite ediceğim url şu şekilde

    domainadi/shop.php?name=isim&user_id=10001 şeklinde

    htaccessde kodlarınızı ekledim.

    isim.alsatnerahat.com yazdığımda çözümleyemiyor dnsi.

    fakat user_id si 10001 olan bilgiyi yazdıgımda şöyle bir url geliyor

    örneğin : 10001.domainadim.com

    /shop.php?name=100001user_id=

    name alanına ekliyor.user_id boş dönüyor.

    Sizce sorun ne olabilir ? ben id yerine name istiyordum ?

    • Altan Tanrıverdi diyor ki:

      Tam olarak yönlendirmek istediğin nedir?
      2 farklı değişken atıyorsun, bunlardan biri sabit mi? Eğer 2si de sabit değilse sadece subdomain belirtmek yetmeyecektir. Şuna benzer bir yönlendirme yapman gerekecektir:

      AAA.alanadi.com/100001 -> /shop.php?name=AAA&user_id=100001

      Bu durumda %1 yetmez, %2 de eklemen gerekecek ifadene.

      Ayrıca şu anki .htaccess dosyanı da gönderir misin?

      • Merhaba hocam,

        Ben iki paremetre gönderdim ,

        100001-name.domain.com dediğimde

        Yönleniyor ilgili sayfaya,fakat URL değişiyor.

        subdomain olarka yazdığım url,php sayfası olarka değişmiş oluyor.

        .Htaccess şu şekilde

        NOT:domain.com alanlarını bilerek değiştirdim.

        Options +FollowSymLinks
        Options +SymlinksIfOwnerMatch

        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.com$ [NC]
        RewriteCond %1 !^(www)$ [NC]
        RewriteRule ^.*$ /shop.php?user_id=%1 [NC]
        ErrorDocument 404 /index.php
        RewriteRule ^ilan-(.*)-(.*).html$ auction_details.php?name=$1&auction_id=$2 [QSA,NC,L]
        RewriteRule ^magaza-(.*).html$ shop.php?name=$1&user_id=$1 [QSA,NC,L]
        RewriteRule ^acil-(.*)-(.*).html$ wanted_details.php?name=$1&wanted_id=$2 [QSA,NC,L]
        RewriteRule ^ilan-(.*)-(.*).html$ auction_details.php?name=$1&auction_id=$2 [QSA,NC,L]
        RewriteRule ^(.*)-(.*).html$ categories.php?name=$1&parent_id=$2 [QSA,NC,L]
        RewriteRule ^iletisim\.html$ content_pages.php?page=contact_us [NC]
        RewriteRule ^magazalar\.html$ stores.php [NC]
        RewriteRule ^acil_acil\.html$ wanted_ads.php [NC]
        RewriteRule ^son_dakika_firsati\.html$ auctions_show.php?option=ending [NC]

        RewriteCond %{HTTP_HOST} !^www\.domain\.com
        RewriteRule (.*) http://www.domain.com/$1 [R=301,L]
        RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
        RewriteRule . %1/%2 [R=301,L]

        RewriteRule ^(.*),(.*)$ $2.php?rewrite_params=$1&page_url=$2

        RewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR]
        RewriteCond %{QUERY_STRING} (|%3E) [NC,OR]
        RewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR]
        RewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2})
        RewriteRule ^(.*)$ index.php [F,L]

      • Altan Tanrıverdi diyor ki:

        İlk izlenimim (tabi bunu test etmek gerekiyor)

        RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.com$ [NC]
        RewriteCond %1 !^(www)$ [NC]

        koşulları ile

        RewriteCond %{HTTP_HOST} !^www\.domain\.com

        koşulunun bir arada kullanılmasının problemli olduğu.

        Diğer sorun ise subdomainde 2 değer göndermene rağmen tek değişken olarak alman, PHP içerisinde bunu ayrıştırıyor musun? Örneğin explode(‘-’, $altalan) vb. gibi.

        Son olarak RewriteRule sonunda [NC] yerine [L] kullan. NC, büyük küçük harf duyarlılığı ile ilgili bir ayar. L ile kuralın orada bittiğini belirtmen yerinde olur.

  7. Merhaba hocam ,

    Dediğiniz tüm işlemleri yaptım ,url yönleniyor bir şekilde.Sanki subdomain olarak görmüyor.

    Mesela magaza.html olarak yaptığımda url sabit kalıyor.

    Ben Sunucudaki dns ayarlarından şüphelenmeye başladım.

    Pleskte dns wildcard ve record ekleme ile ilgili işlemleri yaptım.

    SSH tan httpd.conf düzenledim.Sizce eksik bu tarafta olabilir mi?

    yani
    http://10001-asdad.domain.com dediğimde

    shop.php ye atıyor.
    DNS hatası vermiyor,direk yönleniyor.

    Burada bir sıkıntı olabilirmi acaba?

    Teşekkürler

  8. onder diyor ki:

    walla ben en tepede yazan kodu denedim…
    htaccessin içine site açılmaz oldu..

  9. Hocam cevap bekliyoruz..

    • Altan Tanrıverdi diyor ki:

      Güzel söylüyorsun kardeşim ama blog ortamının teknik destek için kullanılmadığının farkındasınız umarım :) Bizim de çok yoğun işlerimiz mevcut ( Örnek: http://www.webrazzi.com/2010/05/13/7-yeni-girisim-demorazzide-sektorle-bulustu/ ) Kendi işlerimizden fırsat bulduğumuz zaman yardımcı olacağız elbette. Senin durumuna gelirsek subdomain olarak görmüyor demişsin. Yapılan işlemde bir subdomain oluşturulmuyor zaten. Plesk üzerinden record ekledim diyorsun, ne recordu bu? Ayrıca bana .htaccess’in son halini, mevcut siteyi ve url örneklerini gönderebilirsen daha hızlı çözüm bulabiliriz: altant@gmail.com

  10. Teşekkürler Altan bey,fakat konu gerçekten uzmanlık istiyor.Uzun süredir bu sorunun cevabını arıyorum fakat bir çözüme ulaşamadım.

    Konu ile ilgili mail gönderdim.Umarım bir çözüme ulaşabilirim.

    Yazınız için ayrıca teşekkürler

  11. barıs can diyor ki:

    merhaba altan bey benım bır problemım var normalde dune akdar ınternet ıstelırnden fılm ve dızılerı rahatlıkla ızlıyebılıyordum fakat dunden berı hangı sıteye gırıp partlara tıklasam ustunde Video not found or access denied yazısı gelıyor yanlıslıkla bısey mı yaptım dedım ama yapmadıgımıda bılıyorum evde yoktum cunku ınternetten baktım mozılla yuklersem acılır dıyolar fakat yuklemek ıstemıyorum nasıl duzeltebılrım bunu yardımcı olursanız sevınırım bılgısayarı cok bılmıyorum bu yuzden basıtce anlatırsanız ne yapacagımı ısletım sıstemı vısta ıngce…serkan_1571@hotmail.com buraya maıl atarsanız cok yardımcı olmus olursunuz sıteyı tesedufen buldum…

  12. Altan Tanrıverdi diyor ki:

    @fahri @barış, Google’un kullandığı IP havuzundaki bazı IP’ler youtube nedeniyle engellenmiş durumda. İzlemek istediğiniz videolar Youtube menşeli ve sorununuz son haftalar içerisinde başladıysa nedeni budur. Çözüm için Youtube engeli ile ilgili aramalarınız işe yarayabilir.

    @barış Mozilla derken Firefox’u kastediyorsan, tavsiye ederim. (Ama bu sorununun çözümü o değil)

  13. Sorulan sorulara ve sukunetle verilen cevaplara bakıyorum da…

    Altan Tanrıverdi gerçekten sabırlı…

    Ben olsam çok küfürü bası siktiri çekmiştim…