.Htaccess (PHP) ile anında alt etki alanları oluşturun


122

Kayıt sırasında kullanıcıların hesap alanı için web sitemde bir alt etki alanı oluşturacak bir sistem oluşturmak istiyorum.

örneğin johndoe.website.com

Bunun .htaccess dosyasıyla ve muhtemelen web sitesinde başka bir yere yönlendirilmesiyle ilgili bir şey olacağını düşünüyorum. Aslında bilmiyorum. Ama beni başlatacak herhangi bir bilgi çok takdir edilecektir.

Bir kayıt alanı oluşturmak sorun değil - bunu birçok kez yaptım. Alt alan adıyla nereden başlayacağımdan emin değilim.

Yanıtlar:


125

Hızlı özet

  1. DNS sunucunuzda * .website.com bir joker karakter alanı oluşturmanız gerekir.
  2. Ardından vhost konteynerinizde joker karakteri de belirtmeniz gerekir * .website.com - Bu, DOC'larda yapılırServerAlias
  3. Ardından PHP'de alt alanı ayıklayın ve doğrulayın ve uygun verileri görüntüleyin

Uzun versiyon

1. Bir joker karakterli DNS girişi oluşturun

DNS ayarlarınızda, gibi bir joker etki alanı girişi oluşturmanız gerekir *.example.org. Joker karakter girişi şuna benzer:

*.example.org.   3600  A  127.0.0.1

2. Joker karakteri vhost'a ekleyin

Apache yapılandırmasında bir sonraki ServerAlias adımda , DOCs yönergesinde joker karakteri belirten bir vhost kabı kurmanız gerekir . Örnek bir sankon kapsayıcısı:

<VirtualHost *:80>
  ServerName server.example.org
  ServerAlias *.example.org
  UseCanonicalName Off
</VirtualHost>

3. PHP'de hangi alt alan adında olduğunuzu öğrenin

Ardından, PHP betiklerinizde $_SERVERsüper global değişkene bakarak etki alanını bulabilirsiniz . PHP'de alt etki alanını kapmanın bir örneği:

preg_match('/([^.]+)\.example\.org/', $_SERVER['SERVER_NAME'], $matches);
if(isset($matches[1])) {
    $subdomain = $matches[1];
}

Sitenize www.subdomain.example.org veya subdomain.example.org yoluyla ulaşan insanlara izin vermek için burada normal ifadeyi kullandım.

Www ile uğraşmak zorunda kalacağınızı asla tahmin etmiyorsanız. (veya diğer alt alan adları) daha sonra aşağıdaki gibi bir alt dizeyi kullanabilirsiniz:

$subdomain = substr(
                 $_SERVER['SERVER_NAME'], 0,
                 strpos($_SERVER['SERVER_NAME'], '.')
             );

Toplu Sanal Barındırma

Toplu sanal barındırma, sorunun önerdiği gibi bir uygulamayı güçlendirmeye çalışmak yerine genellikle birçok farklı web sitesini barındırmak için kullanacağınızdan biraz farklı bir şemadır.

Ben daha önce benim mod_rewrite tabanlı kitle sanal barındırma ortamı belgeledi blogumda yazı bunu yapmak istediğiniz rota ise bakabilir. Elbette ilgili Apache kılavuz sayfası da var .

Apache'nin ayrıca, kullandığım mod_rewrite yönteminden biraz daha az esnek olan toplu sanal barındırma ile başa çıkmanın dahili bir yolu vardır. Bunların tümü Apache Dinamik Olarak Yapılandırılmış Toplu Sanal Barındırma kılavuz sayfasında açıklanmıştır .


Kullanabilmeniz koşuluyla wildcard subdomains, bunu yapmak için çözümüme bakın .htaccess.
Dan Bray

Htaccess'ten sanal bir ana bilgisayarın eklenebileceğine inanmıyorum, bu da beni güvenlik konusunda endişelendiriyor. RewriteRule "^/?(.*)" "http://%{HTTP_HOST}/%{HTTP_HOST}/$1" [L,R,NE]
2.4'ten

Bunu uygulayan PHP kodunun web sunucusu
uid'i olarak ÇALIŞMAMASI GEREKİR (

12

İlk etapta her alt etki alanına izin verebilir ve ardından alt etki alanının geçerli olup olmadığını kontrol edebilirsiniz. Örneğin:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+\.example\.com$
RewriteRule !^index\.php$ index.php [L]

İçinde index.phpsen özü daha kullanarak alt alan yapabilirsiniz:

if (preg_match('/^([^.]+)\.example\.com$/', $_SERVER['HTTP_HOST'], $match)) {
    var_dump($match[1]);
}

Ancak tüm bunlar, web sunucunuzun her alt alan adını kabul etmesini gerektirir.


3
Ayrıca, DNS sunucunuzun her alt alan adını çözmesini gerektirir.
kaos

1
Bunun diğer web sitelerinde yapıldığını gördüm, kesinlikle her alt alan adını çözmek zorunda değiller mi?
Ben McRae

1
Bununla ne demek istediğine bağlı. Yani, internetteki biri foo.somedomain.com'u her aradığında ve önbelleğe alınmadığında, DNS sunucusunun bunu çözmesi gerekir, o zaman evet.
kaos

Yani, her alan için özel olarak DNS kayıtları oluşturmaları gerekiyor mu, Treffynnon'un cevabına bakın.
kaos

tamam bunun için teşekkürler. vhost'ta joker karakteri belirterek Treffynnon'un ne demek istediğini tam olarak anlamıyorum?
Ben McRae


6

Bunu PHP ile yapmayı daha kolay buldum. Aslında cPanel içinde bir alt alan adı oluşturmak ve klasörünüzü istediğiniz alan adı altında oluşturmaktır. Bunu cPanel'de manuel olarak yapacağınız gibi, ancak bunların hepsi milisaniyeler içinde basit bir PHP işlevi tarafından yapılır. Tıklamaya gerek yok :)

function create_subdomain($subDomain,$cPanelUser,$cPanelPass,$rootDomain) {

    //  $buildRequest = "/frontend/x3/subdomain/doadddomain.html?rootdomain=" . $rootDomain . "&domain=" . $subDomain;

    $buildRequest = "/frontend/x3/subdomain/doadddomain.html?rootdomain=" . $rootDomain . "&domain=" . $subDomain . "&dir=public_html/subdomains/" . $subDomain;

    $openSocket = fsockopen('localhost',2082);
    if(!$openSocket) {
        return "Socket error";
        exit();
    }

    $authString = $cPanelUser . ":" . $cPanelPass;
    $authPass = base64_encode($authString);
    $buildHeaders  = "GET " . $buildRequest ."\r\n";
    $buildHeaders .= "HTTP/1.0\r\n";
    $buildHeaders .= "Host:localhost\r\n";
    $buildHeaders .= "Authorization: Basic " . $authPass . "\r\n";
    $buildHeaders .= "\r\n";

    fputs($openSocket, $buildHeaders);
        while(!feof($openSocket)) {
           fgets($openSocket,128);
        }
    fclose($openSocket);

    $newDomain = "http://" . $subDomain . "." . $rootDomain . "/";

   //  return "Created subdomain $newDomain";

}

CPanel'de başarıyla oluşturulup oluşturulmadığını kontrol edin ve FTP (veya dosya yöneticisi) ile public_html / subdomain klasörünün içinde ne olduğunu kontrol edin. Bir alt etki alanı oluşturduğunuzda bir şeyler ekleyen bir cPanel ayarınız varsa, bu, anında alt etki alanları oluşturmakla ilgili değildir.
Adrian P.

CPanel
Ruchi'de

O zaman cPanel üzerinde yeterli izniniz yok. Bu paylaşılan barındırma VPS mi yoksa özel sunucu mu?
Adrian P.

Alt alan adını oluşturmamanın birden çok nedeni olabilir. Yukarıdaki komut dosyasıyla değil, DNS yapılandırmanızla ilgili. Bunu okuyun ve cPanel forumlarında yardım isteyin. forums.cpanel.net/threads/subdomains-not-working.228132
Adrian P.

5

En kolay yol, tüm alt etki alanlarını (joker karakterle *) / wwwroot'unuzu gösterecek şekilde yeniden yönlendirmektir. Ardından aşağıdaki kodla bu klasöre .htaccess ekleyin:

RewriteCond %{ENV:REDIRECT_SUBDOMAIN} ="" 
RewriteCond %{HTTP_HOST} ^([a-z0-9][-a-z0-9]+)\.domain\.com\.?(:80)?$ [NC] 
RewriteCond %{DOCUMENT_ROOT}/%1 -d 
RewriteRule ^(.*) %1/$1 [E=SUBDOMAIN:%1,L] 
RewriteRule ^ - [E=SUBDOMAIN:%{ENV:REDIRECT_SUBDOMAIN},L]

Bu, / wwwroot klasörünün her alt klasörünün alt alan adı (klasöradı.domain.com) aracılığıyla kabul edilebilir olmasını sağlayacaktır.

Bu yıllar önce http://www.webmasterworld.com/apache/3163397.htm adresinde bulundu


4

.Htaccess ile ilgisi yok. Alt etki alanları için DNS kayıtları ve sanal barındırma ayarlamanız gerekir.


4

Mod_vhost_alias bunu yapmak için doğru modüldür.

Bir satırla, Apache'ye dizin karması vb. İle doğru yere bakmasını söyleyebilirsiniz. Örneğin, satır:

VirtualDocumentRoot /http/users/%3.1/%3.2/%3

Apache'ye subdomain.alaniniz.com için istendiğinde belge kökünü / http / users / s / u / subdomain olarak ayarlamasını söyler


0

Apache'nin Dinamik Toplu Sanal Barındırma ile joker karakter DNS'in de makul bir çözüm olduğunu düşünüyorum. Yine de hiç denemedim.

Birden fazla sunucuya ölçekleme ihtiyacınız varsa veya diğer çözümler sizin için çalışmıyorsa, veritabanı odaklı bir DNS sunucusu kullanmanızı tavsiye ederim. Geçmişte MyDNS'yi başarıyla kullandım . MySQL (veya PostgreSQL) kullandığından, DNS'nizi anında PHP veya başka herhangi bir şeyle güncelleyebilirsiniz. Kod bir süredir güncellenmiş gibi görünmüyor, ancak DNS ve bu nedenle tam olarak son teknoloji değil.


0

Joker karakter alt etki alanı oluşturma yöntemleri

İlk olarak, sunucunuzun DNS düzenleyicisini kullanarak DNS ayarlarını oluşturmanız gerekir.

  1. Sunucu ip adresinde Aana bilgisayar *joker kartıyla DNS ayarlarında kayıt oluşturun .

    * 1400 IN A ip_address

  2. ADNS ayarlarında ana bilgisayar @veya domain_name.tldsunucu ip adresinde bir kez daha kayıt oluşturun . tld, üst düzey alan adları veya .com, .org vb. gibi alanların uzantıları anlamına gelir.

    @ 1400 IN A ip_address veya domain_name.tld 1400 IN A ip_address

  3. CNAMEŞunun gibi kayıt oluşturun :

    www 1400 IN A domainname.tld

  4. Alt alan adını *joker karakterle oluşturun*.domain.tld
  5. Alt alan dizininizde htaccess oluşturun *.domain.tldve şu kodu girin:

    Options +FollowSymLinks 
    RewriteEngine On 
    RewriteBase /
    RewriteRule ^([aA-zZ0-9]+)$ index.php?data=$1
    RewriteCond %{HTTP_HOST} ^([aA-zZ0-9]+)\.([aA-zZ0-9-]+)\.([aA-zZ]+)
    RewriteRule ([aA-zZ0-9]+) index.php?data=%1

    İlk joker karakter alt alan adınızı aşağıdaki gibi test edin: example.domainname.tld

Verileri htaccess kullanarak parametre olarak iletmek istemiyorsanız, aşağıdaki kodlamayı kullanarak da verileri alabilirsiniz:

define("SUBDOMAIN_PARENT","domainname.tld");   
class getData
    {
         function __construct()
        {
            $this->data="";
            $http_host=$_SERVER['HTTP_HOST'];
         $subdom_data= str_replace(SUBDOMAIN_PARENT,"",$http_host);
         $expl_subdom_data=explode(".",$subdom_data);
      $expl_subdom_data=array_filter($expl_subdom_data);

            if($expl_subdom_data!=NULL)
            {
           $this->data=end($expl_subdom_data);
            }
       }
    }
$GLOBALS['get_data']=new getData();

ve global değişkeninizi istediğiniz yerde kullanın global $get_data.

echo $get_data->data; //example

(not: Bu sınıf esas olarak alt alan http_hostadını tam olarak almak için kullanılır . çünkü alt alan adınızdan önce birleştirilen bazı ekstra isimler de şu şekildedir www.example.domainname.tld. Bu dönüş $_GET['data']='wwww'Yani benim önerim, $_SERVER['http_host']içinde $_SERVER['query_string']veya aktarılan htaccess parametrelerini kullanmak yerine tam değerleri almak için for öğesini kullanmaktır . dizin sayfanız)

6. Bu joker karakterli alt etki alanlarının yürütülmesini hızlandırın, TTL - DNS AYARLARI'nda N saniye kullanın.

7. Verilen ttl sürenizden (600 - 10 dakika) sonra alt alanı kontrol edin => http://abc.domain.tld

(not: joker karakterli alt alanlar var olan alt alan adlarını geçersiz kılmaz. Çünkü Birinci öncelik her zaman var olan alt alanlarınız için)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.