PHP'nin her kullanıcı için otomatik olarak alt alan adı oluşturmasına nasıl izin verilir?


162

Nasıl böyle bir alt alana oluşturabilirim http://user.mywebsite.com ? Bir şekilde htaccess'e erişmem gerekiyor mu? Aslında sadece saf php kodu ile oluşturmak mümkün mü yoksa bazı harici komut dosyası sunucu tarafı dili kullanmanız gerekir?

Yanıtlayanlar için: Peki, o zaman, bir tür DNS erişimi sağlayıp sağlamadığımı sormam gerekir mi ??


Alt alan yönlendirmesi (Mark yanıtı) zaten etkinleştirildiğinden, belki de sağlayıcınızdan DNS erişimi istemeniz gerekmez! Alt alanlar size bir sonuç verirse tarayıcınızda deneyin. Ve sonra onları .htaccess dosyasıyla yönlendirin.
powtac

Eğer kullanabiliyorsanız wildcard subdomainsbunu başarabilirsiniz .htaccess. Benim çözümüme bakın.
Dan Bray

Yanıtlar:


135

Özel bir A kaydı oluşturmak istiyorsunuz .

Böyle bir şey yapmanıza izin verecek bir A kaydı belirtirken joker karakterler kullanabileceğinizden eminim:

*.mywebsite.com       IN  A       127.0.0.1

127.0.0.1, web sunucunuzun IP adresi olacaktır. Kaydı gerçekten ekleme yöntemi sunucunuza bağlıdır.


Http://mywebsite.com/user gibi yapmak bir seçenekse kurmak çok daha kolay olurdu.

Sonra sadece şuna benzer bir .htaccess dosyası ekleyebilirsiniz:

Options +FollowSymLinks

RewriteEngine On
RewriteRule ^([aA-zZ])$  dostuff.php?username=$1

Yukarıda, kullanıcı adları az karakterleriyle sınırlıdır


Alt alan adını kapmak için yeniden yazma kuralı şöyle görünür:

RewriteCond %{HTTP_HOST} ^(^.*)\.mywebsite.com
RewriteRule (.*)  dostuff.php?username=%1

1
Her alt alan farklı bir sunucudan sunulmadığı sürece, Kanonik Ad (CNAME) kayıtları oluşturmak daha iyi bir plan olurdu. en.wikipedia.org/wiki/List_of_DNS_record_types
theraccoonbear

Alt alan güzel görünüyor. Tüm alt alan isteklerinin doğru bir şekilde ele alındığından emin olmanız gerekeceğinden, ayarlanması çok daha fazla iş olacak. Apache ile bu korkunç değil, ancak barındırılan bir ortamda zor olabilir.
Mark Biek

@theraccoonbear CNAME ile de joker karakterler kullanabileceğinizi varsayarsak, bu bir düşünce.
Mark Biek

3
Daha spesifik olmalıydım. .htaccess IIS için değil Apache içindir. Url yeniden yazma IIS ile nasıl işlenir emin değilim ama orada SO hakkında bazı sorular olduğuna inanıyorum.
Mark Biek

1
selam işareti, sana yukarıda verdi adımları takip ama ne zaman xyz.mydomain.com o yönlendirir xyz.mydomain.com/cgi-sys/defaultwebpage.cgi ... Yaparım ihtiyaç yapmak için başka bir şey daha sonra yukarıda belirtilen adımlar ?
Ashish Rajan

30

Takip ettiğiniz özelliğe Joker Karakter Alt Etki Alanları denir . Her bir alt alan adı için DNS ayarlamanıza ve bunun yerine yeniden yönlendirme için apache yeniden yazma işlemlerine izin vermenize izin vermez. Burada güzel bir öğretici bulabilirsiniz , ancak orada binlerce öğretici var. İşte bu öğreticiden gerekli kodu:

<VirtualHost 111.22.33.55>
    DocumentRoot /www/subdomain
    ServerName www.domain.tld
    ServerAlias *.domain.tld
</VirtualHost>

Ancak VirtualHosts kullanımını gerektirdiği için, sunucunun httpd.conf dosyasında yerel bir .htaccess yerine ayarlanması gerekir.


paylaşılan barındırma beri ben httpd.conf dosyasına ulaşamıyor. Ne yapabilirim?
Webber Depor

23

Mark'dan biraz farklı yapıyorum. Ben tüm etki alanı geçmek ve php alt etki alanı kapmak.

RewriteCond {REQUEST_URI} !\.(png|gif|jpg)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?uri=$1&hostName=%{HTTP_HOST}

Bu, görüntüleri yok sayar ve diğer her şeyi index.php dosyamla eşler. Yani eğer gidersem

http://fred.mywebsite.com/album/Dance/now

geri aldım

http://fred.mywebsite.com/index.php?uri=album/Dance/now&hostName=fred.mywebsite.com

Sonra benim index.php kodu ben sadece hostName kullanıcı adımı patlayabilir. Bu bana güzel güzel SEO URL'leri verir.


14

Yukarıda açıklandığı gibi joker karakter DNS ayarladık. Yani kayıt * .adiniz.com

Daha sonra tüm alt alan adları aslında aynı yere gider, ancak PHP her bir alt alanı farklı bir hesap olarak ele alır.

Aşağıdaki kodu kullanıyoruz:

$url=$_SERVER["REQUEST_URI"];
$account=str_replace(".yourdomain.com","",$url);

Bu kod, $accountdeğişkeni yalnızca alt alan adıyla aynı şekilde ayarlar . Daha sonra dosyalarını ve diğer bilgileri hesaplarına göre alabilirsiniz.

Bu muhtemelen yukarıda listelendiği gibi etkili değildir, ancak BIND ve / veya sınırlı .htaccess'e erişiminiz yoksa bu yöntem çalışmalıdır (ana makineniz sizin için joker karakter ayarlayacağı sürece).

Bu yöntemi, çok şirketli bir e-ticaret uygulaması için müşteri veritabanına bağlanmak için kullanırız, ancak sizin için de işe yarayabilir.


2
Ben op bu gibi bir cevap olabilir düşünüyorum, op PHP nasıl altdüzenleri ele sormak nasıl DEĞİL web veya DNS Sunucuları alt etki alanları handel.
Salem

8

Apache toplu sanal barındırma kullanabildiğinizde .htaccess dosyaları ile uğraşmayın .

Belgelerden:

#include part of the server name in the filenames VirtualDocumentRoot /www/hosts/%2/docs

Bir şekilde sorunuzun tersi: her 'alt alan adı' bir kullanıcı. Kullanıcı yoksa, bir 404 alırsınız.

Tek dezavantajı, ortam değişkeninin kullanılan alt dizine DOCUMENT_ROOTdoğru bir şekilde ayarlanmamış olması değil, de htconfig dosyasındaki varsayılan document_root seçeneğidir.


1
Bunu nasıl kullanacağımdan gerçekten emin değilim ... ve sonunda neden htaccess ile uğraşmıyorsunuz?
Skuta

6

Alt alanlar ve çok alanlı web uygulamaları için basit PHP çözümü

Adım 1. DNS "example.org" hizmetini vereceğiniz alan adları (veya alan adı) için "*" olarak bir kayıt verin

A record => *.example.org
A record => *.example.net

Adım 2. Kullanıcı oturum açarken veya oturum açarken giriş bilgilerinin benzersiz olup olmadığını kontrol edin. Ayrıca, bu girişlerde noktalardan kaçının.

Adım 3. Ardından sorguyu kontrol edin

        // Request was http://qwerty.example.org
        $q = explode('.', $_SERVER['HTTP_HOST']);
        /*
            We get following array
            Array
            (
                [0] => qwerty
                [1] => example
                [2] => org
            )
        */

        // Step 4.
        // If second piece of array exists, request was for 
        // SUBDOMAIN which is stored in zero-piece $q[0]
        // otherwise it was for DOMAIN

        if(isset($q[2])) {
            // Find stuff in database for login $q[0] or here it is "qwerty"
            // Use $q[1] to check which domain is asked if u serve multiple domains
        }

?>

Bu çözüm farklı alan adlarına hizmet edebilir

qwerty.example.org
qwerty.example.net 

johnsmith.somecompany.com
paulsmith.somecompany.com

Farklı sunulan farklı alan adlarında aynı takma adlara ihtiyacınız varsa, oturum açarken alan adı için kullanıcı tercihini depolamanız gerekebilir.

smith.example.org // Show info about John Smith
smith.example.net // Show info about Paul Smith 

4

URL'yi [potansiyel olarak] yeniden yazabilirsiniz, ancak evet: bir kullanıcı eklendiğinde kendi alt alan adını alması için DNS ayarlarınızı kontrol etmeniz gerekir.


4

WWW sunucunuzda yeni alt etki alanını işlemek için yapılan yapılandırma değişikliklerine ek olarak, kodunuzun DNS kayıtlarınızda değişiklik yapması gerekir. Bu nedenle, kendi BIND (veya benzeri) çalıştırmıyorsanız, ad sunucusu sağlayıcınızın yapılandırmasına nasıl erişeceğinizi bulmanız gerekir. Bir çeşit API sunmuyorlarsa bu biraz zor olabilir.

Güncelleme: Evet, aynı zamanda ad sunucusu hizmetini de sağlayıp sağlamadıklarını (genellikle olduğu gibi) kayıt kuruluşunuzla kontrol ederdim. Bu seçeneği daha önce hiç araştırmadım ama tüketici kayıt şirketlerinin çoğunun yapmadığından şüpheleniyorum. GoDaddy API'leri ve GoDaddy DNS API'ları için Google'a gittim, ancak bir şey açamadım, bu yüzden en iyi seçeneğin sağlayıcınızla çevrimiçi yardıma göz atmak olacağını tahmin ediyorum ve bu soruya cevap vermezse, beklemeye alın destek personelinin.


3

İlk olarak, sunucunuzun joker karakter alt alanlarına izin verecek şekilde yapılandırıldığından emin olmanız gerekir. Bunu JustHost'ta elle adlandırılmış bir alt alan adı oluşturarak başardım *. Ayrıca subdomainsjoker karakter alt alanları için belge kökü olarak adlandırılan bir klasör belirttim . Bunu .htaccessalt alanlar klasörünüzdeki bir dosyaya ekleyin:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.website\.com$
RewriteCond %{HTTP_HOST} ^(\w+)\.website\.com$
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1
RewriteRule ^(.*)$ /%1/$1 [QSA]

Son olarak, tek yapmanız gereken alt etki alanları klasörünüzde bir klasör oluşturmak ve alt etki alanının dosyalarını bu dizine yerleştirmektir.


3

.htaccessSunucunuzun joker karakter alt alanlarına izin verecek şekilde yapılandırılması şartıyla bu gerçekleştirilebilir . Bunu JustHost'ta elle adlandırılmış *bir alt etki alanı oluşturarak ve joker alt etki alanları için belge kökü olarak alt etki alanları adlı bir klasör belirterek başardım . Bunu .htaccessdosyanıza ekleyin :

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.website\.com$
RewriteCond %{HTTP_HOST} ^(\w+)\.website\.com$
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1
RewriteRule ^(.*)$ /%1/$1 [QSA]

Son olarak, alt alan adınız için bir klasör oluşturun ve alt alan dosyalarınızı yerleştirin.


1

Ben sadece CloudFlare (ücretsiz) kullanıyorsanız, dns'lerinizi kolayca yönetmek için API'larını kullanabileceğinizi eklemek istedim.


0

PHP ve Htaccess kullanarak Dinamik Alt Alanlar oluşturun

(1) Kök .htaccess

Bu dosya yeniden yönlendirme olduğunu http://www.yourwebsite.com için http://yourwebsite.com ana sayfası kullanımı için. Web sitenize_klasörünüze tüm alt alan yönlendirmesi

RewriteEngine On

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

RewriteCond %{HTTP_HOST} ^yourwebsite\.com $
RewriteCond %{REQUEST_URI} !^/yourwebsite_folder/
RewriteRule (.*) /yourwebsite_folder/$1

RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteCond %{REQUEST_URI} !^/yourwebsite_folder/
RewriteRule (.*) /yourwebsite_folder/$1

(2) Klasör İçinde .htaccess

Bu dosya alt alan URL'lerini yeniden yazıyor.

http://yourwebsite.com/index.php?siteName=9lessons - http://9lessons.yourwebsite.com

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteRule ^([aA-zZ])$ index.php?siteName=$1
RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteRule (.*) index.php?siteName=%1

Daha .htaccess ipuçları: Htaccess Dosya Eğitimi ve İpuçları.

index.php

Bu dosya, alt alan değerini doğrulayan normal ifadeler kullanarak basit PHP kodu içerir.

<?php
$siteName='';
if($_GET['siteName'] )
{
$sitePostName=$_GET['siteName'];
$siteNameCheck = preg_match('~^[A-Za-z0-9_]{3,20}$~i', $sitePostName);
   if($siteNameCheck)
   {
     //Do something. Eg: Connect database and validate the siteName.
   }
   else
  {
    header("Location: http://yourwebsite.com/404.php");
   }
}
?>
//HTML Code
<!DOCTYPE html>
<html>
<head>
<title>Project Title</title>
</head>
<body>
<?php if($siteNameCheck) { ?>
//Home Page
<?php } else { ?>
//Redirect to Subdomain Page.
<?php } ?>
</body>
</html>

Alt Alan Klasörü Yok

Proje dizini olarak root dizinini (htdocs / public_html) kullanıyorsanız, aşağıdaki .htaccess dosyasını kullanın.

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

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

RewriteRule ^([aA-zZ])$ index.php?siteName=$1
RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteRule (.*) index.php?siteName=%1
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.