Buat subdomain dengan cepat dengan .htaccess (PHP)

122

Saya ingin membuat sistem yang saat mendaftar akan membuat subdomain di situs web saya untuk area akun pengguna.

mis. johndoe.website.com

Saya pikir itu akan ada hubungannya dengan file .htaccess dan mungkin mengarahkan ke lokasi lain di situs web? Saya sebenarnya tidak tahu. Tetapi informasi apa pun untuk memulai saya akan sangat dihargai.

Membuat area pendaftaran bukanlah masalahnya - Saya telah melakukan ini berkali-kali. Saya hanya tidak yakin harus mulai dari mana dengan subdomain.

Ben McRae
sumber

Jawaban:

125

Ikhtisar singkat

  1. Anda perlu membuat domain wildcard di server DNS * .website.com
  2. Kemudian dalam penampung vhost Anda, Anda perlu menentukan wildcard juga * .website.com - Ini dilakukan di ServerAlias DOC
  3. Kemudian ekstrak dan verifikasi subdomain di PHP dan tampilkan data yang sesuai

Versi panjang

1. Buat entri DNS karakter pengganti

Dalam pengaturan DNS Anda, Anda perlu membuat entri domain karakter pengganti seperti *.example.org. Entri karakter pengganti terlihat seperti ini:

*.example.org.   3600  A  127.0.0.1

2. Sertakan wildcard di vhost

Selanjutnya dalam konfigurasi Apache Anda perlu menyiapkan penampung vhost yang menentukan wildcard di direktif ServerAlias DOCs . Contoh wadah vhost:

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

3. Cari tahu subdomain Anda di PHP

Kemudian di skrip PHP Anda, Anda dapat mengetahui domain dengan melihat di $_SERVERvariabel super global. Berikut adalah contoh mengambil subdomain di PHP:

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

Saya telah menggunakan regex di sini untuk mengizinkan orang membuka situs Anda melalui www.subdomain.example.org atau subdomain.example.org.

Jika Anda tidak pernah mengantisipasi harus berurusan dengan www. (atau subdomain lain) maka Anda cukup menggunakan substring seperti ini:

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

Hosting Virtual Massal

Hosting virtual massal adalah skema yang sedikit berbeda dengan yang di atas karena Anda biasanya menggunakannya untuk meng-host banyak situs web yang berbeda daripada mencoba menggunakannya untuk menjalankan aplikasi seperti yang diajukan pertanyaan.

Saya telah mendokumentasikan lingkungan hosting virtual massal berbasis mod_rewrite saya sebelumnya dalam sebuah posting di blog saya , yang dapat Anda lihat jika itu adalah rute yang ingin Anda ambil. Ada juga, tentu saja, halaman manual Apache .

Apache juga memiliki cara internal untuk menangani hosting virtual massal yang sedikit kurang fleksibel daripada metode mod_rewrite yang telah saya gunakan. Ini semua dijelaskan di halaman manual Apache Dynamically Configured Mass Virtual Hosting .

Treffynnon
sumber
Asalkan Anda dapat menggunakan wildcard subdomains, lihat solusi saya untuk melakukan ini di .htaccess.
Dan Bray
Saya tidak percaya virtual host dapat ditambahkan dari .htaccess itu juga membuat saya khawatir tentang keamanannya. Dari 2.4, seharusnya dimungkinkan untuk memilih direktori dasar yang bergantung pada nama host (Tetapi metode Dan juga memiliki beberapa masalah) Pertimbangkan:RewriteRule "^/?(.*)" "http://%{HTTP_HOST}/%{HTTP_HOST}/$1" [L,R,NE]
symcbean
Perhatikan bahwa kode PHP yang menerapkan ini TIDAK HARUS dijalankan sebagai webserver uid (harus sebagai pengguna khusus melalui sudo)
symcbean
12

Anda dapat mengizinkan setiap subdomain sejak awal dan kemudian memeriksa apakah subdomain tersebut valid. Sebagai contoh:

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

Di dalam index.phpAnda dapat mengekstrak subdomain menggunakan:

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

Tetapi semua ini mengharuskan server web Anda menerima setiap nama subdomain.

Gumbo
sumber
3
Selain itu, ini mengharuskan server DNS Anda menyelesaikan setiap nama subdomain.
kekacauan
1
Saya telah melihat ini dilakukan di situs web lain, tentunya mereka tidak harus menyelesaikan setiap subdomain setiap kali bukan?
Ben McRae
1
Tergantung apa yang Anda maksud dengan itu. Jika maksud Anda, setiap kali seseorang di internet mencari foo.somedomain.com dan tidak di-cache, server DNS mereka harus menyelesaikannya, maka ya.
kekacauan
Jika maksud Anda, apakah mereka harus menyiapkan data DNS secara khusus untuk setiap domain, lihat jawaban Treffynnon.
kekacauan
oke terima kasih untuk itu. saya tidak begitu mengerti apa yang dimaksud Treffynnon dengan menentukan wildcard di vhost?
Ben McRae
6

Saya merasa lebih mudah melakukannya dengan PHP. Faktanya adalah membuat subdomain dalam cPanel dan membuat folder Anda di bawah nama domain yang diinginkan. Seperti yang akan Anda lakukan secara manual di cPanel tetapi semua itu dilakukan dalam milidetik dengan fungsi PHP sederhana. Tidak perlu klik :)

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";

}
Adrian P.
sumber
Periksa apakah itu berhasil dibuat di cPanel dan, periksa dengan FTP (atau manajer file), apa yang ada di dalam folder public_html / subdomain. Jika Anda memiliki pengaturan cPanel menambahkan barang saat Anda membuat subdomain, ini tidak terkait dengan pembuatan subdomain dengan cepat.
Adrian P.
Tidak ada yang belum dibuat di cPanel
Ruchi
Maka Anda tidak memiliki cukup izin di cPanel. Apakah ini VPS hosting bersama atau server khusus?
Adrian P.
Ini bisa menjadi beberapa alasan untuk tidak membuat subdomain. Tidak terkait dengan skrip di atas tetapi dengan konfigurasi DNS Anda. Baca itu dan minta bantuan di forum cPanel. forums.cpanel.net/threads/subdomains-not-working.228132
Adrian P.
5

Cara termudah adalah dengan mengarahkan semua subdomain (dengan wildcard *) untuk mengarah ke / wwwroot Anda. Kemudian taruh .htaccess ke folder ini dengan kode berikut:

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]

Ini akan membuat setiap subfolder dari folder / wwwroot dapat diterima melalui subdomain (foldername.domain.com).

Ditemukan beberapa tahun yang lalu di http://www.webmasterworld.com/apache/3163397.htm

Glavić
sumber
4

Ini tidak ada hubungannya dengan .htaccess. Anda harus menyiapkan data DNS dan hosting virtual untuk subdomain.

kekacauan
sumber
4

Mod_vhost_alias adalah modul yang tepat untuk melakukan ini.

Dengan satu baris Anda dapat memberi tahu Apache untuk melihat tempat yang tepat, dengan hashing direktori, dll. Misalnya, baris:

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

akan memberi tahu Apache untuk mengatur root dokumen ke / http / users / s / u / subdomain ketika diminta untuk subdomain.yourdomain.com

Julien Tartarin
sumber
0

Saya pikir DNS kartu liar dengan Hosting Virtual Massa Dinamis Apache adalah solusi yang masuk akal juga. Padahal, saya belum pernah mencobanya.

Jika Anda memiliki kebutuhan untuk skala ke beberapa server atau solusi lain tidak berhasil untuk Anda, saya sarankan menggunakan server DNS berbasis database. Saya telah berhasil menggunakan MyDNS sebelumnya. Karena menggunakan MySQL (atau PostgreSQL), Anda dapat memperbarui DNS Anda dengan cepat dengan PHP atau apa saja. Kode tersebut sepertinya tidak diperbarui dalam beberapa saat, tetapi itu DNS dan oleh karena itu tidak benar-benar canggih.

Barrett Conrad
sumber
0

Metode pembuatan subdomain karakter pengganti

Pertama, Anda harus membuat pengaturan DNS menggunakan editor DNS server Anda.

  1. Buat Acatatan dalam pengaturan DNS dengan *kartu liar host di alamat ip server.

    * 1400 IN A ip_address

  2. Buat sekali lagi Acatatan dalam pengaturan DNS dengan host @atau domain_name.tlddi alamat ip server. tld berarti domain level teratas atau ekstensi dari domain seperti .com, .org, dll ....

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

  3. Buat CNAMEcatatan seperti:

    www 1400 IN A domainname.tld

  4. Buat subdomain dengan karakter *pengganti seperti*.domain.tld
  5. Buat htaccess di direktori subdomain Anda *.domain.tlddan masukkan kode ini:

    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

    Uji subdomain wildcard pertama Anda seperti example.domainname.tld

Jika Anda tidak tertarik untuk melewatkan data sebagai parameter menggunakan htaccess, Anda juga bisa mendapatkan datanya dengan menggunakan pengkodean berikut:

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();

dan gunakan variabel global Anda di mana saja seperti global $get_data.

echo $get_data->data; //example

(Catatan: Kelas ini terutama digunakan untuk mendapatkan nama subdomain yang tepat dari http_host. karena beberapa nama tambahan yang digabungkan sebelum subdomain Anda juga berlaku seperti www.example.domainname.tld. Kembalian ini $_GET['data']='wwww'Jadi saran saya adalah menggunakan $_SERVER['http_host']untuk mendapatkan nilai yang tepat daripada menggunakan $_SERVER['query_string']atau melewati parameter htaccess di halaman indeks Anda)

6. Percepat eksekusi subdomain wildcard ini menggunakan N detik di TTL - DNS SETTINGS.

7. Periksa subdomain setelah waktu ttl yang Anda berikan (600 - 10 menit) seperti => http://abc.domain.tld

(catatan: subdomain karakter pengganti tidak menggantikan subdomain yang ada. Karena selalu prioritas pertama untuk subdomain Anda yang ada)

karthikeyan ganesan
sumber