Bagaimana cara membiarkan PHP membuat subdomain secara otomatis untuk setiap pengguna?


162

Bagaimana cara membuat subdomain seperti http://user.mywebsite.com ? Apakah saya harus mengakses htaccess? Apakah sebenarnya hanya mungkin untuk membuatnya melalui kode php murni atau saya perlu menggunakan beberapa bahasa sisi skrip-server eksternal?

Bagi mereka yang menjawab: Baiklah, haruskah saya bertanya pada hosting saya jika mereka menyediakan semacam akses DNS ??


Mungkin tidak perlu meminta penyedia Anda untuk akses DNS, karena perutean subdomain (jawaban Mark) sudah diaktifkan! Coba saja di browser Anda jika subdomain memberi Anda hasil. Lalu rutekan mereka dengan file .htaccess.
powtac

Jika Anda dapat menggunakan wildcard subdomainsini dapat dicapai dalam .htaccess. Lihat solusi saya.
Dan Bray

Jawaban:


135

Anda ingin membuat catatan A kustom .

Saya cukup yakin bahwa Anda dapat menggunakan wildcard saat menentukan A record yang memungkinkan Anda melakukan sesuatu seperti ini:

*.mywebsite.com       IN  A       127.0.0.1

127.0.0.1 akan menjadi alamat IP server web Anda. Metode sebenarnya menambahkan catatan akan tergantung pada host Anda.


Melakukannya seperti http://mywebsite.com/user akan jauh lebih mudah diatur jika itu opsi.

Maka Anda bisa menambahkan file .htaccess yang terlihat seperti ini:

Options +FollowSymLinks

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

Di atas, nama pengguna terbatas pada karakter az


Aturan penulisan ulang untuk mengambil subdomain akan terlihat seperti ini:

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

1
Kecuali setiap subdomain disajikan dari server yang berbeda, saya akan membuat catatan nama Canonical (CNAME) akan menjadi rencana yang lebih baik. en.wikipedia.org/wiki/List_of_DNS_record_types
theraccoonbear

Subdomain memang terlihat bagus. Akan lebih banyak pekerjaan untuk diatur karena Anda harus memastikan bahwa semua permintaan subdomain ditangani dengan benar. Ini tidak buruk dengan Apache tetapi mungkin rumit di lingkungan yang dihosting.
Mark Biek

@theraccoonbear Dengan asumsi Anda dapat menggunakan wildcard dengan CNAME juga, itu sebuah pemikiran.
Mark Biek

3
Saya seharusnya lebih spesifik. .htaccess adalah untuk Apache, bukan IIS. Saya tidak yakin bagaimana penulisan ulang url ditangani dengan IIS tapi saya yakin ada beberapa pertanyaan tentang SO.
Mark Biek

1
hai tk , saya mengikuti langkah-langkah yang Anda berikan di atas tetapi ketika saya melakukan xyz.mydomain.com itu diarahkan ke xyz.mydomain.com/cgi-sys/defaultwebpage.cgi ... Apakah saya perlu melakukan hal lain kemudian langkah-langkah yang disebutkan di atas ?
Ashish Rajan

30

Fitur yang Anda cari disebut Wildcard Subdomains . Ini memungkinkan Anda tidak harus mengatur DNS untuk setiap subdomain, dan sebagai gantinya menggunakan penulisan ulang apache untuk pengalihan. Anda dapat menemukan tutorial yang bagus di sini , tetapi ada ribuan tutorial di luar sana. Ini adalah kode yang diperlukan dari tutorial itu:

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

Namun karena diperlukan penggunaan VirtualHosts itu harus diatur dalam file httpd.conf server, bukan .htaccess lokal.


saya tidak dapat mencapai file httpd.conf karena saya menggunakan hosting bersama. apa yang dapat saya?
Webber Depor

23

Saya melakukannya sedikit berbeda dari Mark. Saya melewati seluruh domain dan mengambil subdomain di php.

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

Ini mengabaikan gambar dan memetakan segalanya ke file index.php saya. Jadi jika saya pergi ke

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

saya kembali

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

Kemudian dalam kode index.php saya, saya hanya menghapus nama pengguna saya dari hostName. Ini memberi saya URL SEO yang cukup bagus.


14

Kami menyiapkan DNS wildcard seperti yang mereka jelaskan di atas. Jadi catatannya adalah * .namaanda.com

Kemudian semua subdomain sebenarnya pergi ke tempat yang sama, tetapi PHP memperlakukan setiap subdomain sebagai akun yang berbeda.

Kami menggunakan kode berikut:

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

Kode ini hanya mengatur $accountvariabel yang sama dengan subdomain. Anda kemudian dapat mengambil file dan informasi lainnya berdasarkan akun mereka.

Ini mungkin tidak seefisien cara yang mereka sebutkan di atas, tetapi jika Anda tidak memiliki akses ke BIND dan / atau .htaccess terbatas metode ini akan berfungsi (selama host Anda akan mengatur wildcard untuk Anda).

Kami benar-benar menggunakan metode ini untuk terhubung ke basis data pelanggan untuk aplikasi e-commerce multi-perusahaan, tetapi mungkin juga cocok untuk Anda.


2
Saya pikir ini bisa menjadi jawaban arus, Sebagai op bertanya tentang bagaimana PHP menangani subdmo BUKAN Bagaimana web atau Server DNS menangani subdomain.
Salem

8

Jangan repot-repot dengan file .htaccess saat Anda dapat menggunakan hosting virtual massa Apache .

Dari dokumentasi:

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

Di satu sisi itu kebalikan dari pertanyaan Anda: setiap 'subdomain' adalah pengguna. Jika pengguna tidak ada, Anda mendapatkan 404.

Satu-satunya kelemahan adalah bahwa variabel lingkungan DOCUMENT_ROOTtidak diatur dengan benar ke subdirektori yang digunakan , tetapi document_root default di de htconfig.


1
Saya tidak begitu yakin bagaimana menggunakannya .. dan pada akhirnya, mengapa tidak mengacaukan htaccess?
Skuta

6

Solusi PHP sederhana untuk subdomain dan aplikasi web multi-domain

Langkah 1. Berikan catatan DNS A sebagai "*" untuk domain (atau domain) yang akan Anda layani "example.org"

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

Langkah 2. Periksa keunikan login saat pengguna mendaftar atau mengubah login. Juga, hindari titik-titik dalam login tersebut.

Langkah 3. Kemudian periksa kueri

        // 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
        }

?>

Solusi ini dapat melayani berbagai domain

qwerty.example.org
qwerty.example.net 

johnsmith.somecompany.com
paulsmith.somecompany.com

Jika Anda perlu torehan yang sama pada domain yang berbeda dilayani berbeda, Anda mungkin perlu menyimpan choise pengguna untuk domain saat mendaftar masuk.

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

4

Anda dapat [berpotensi] melakukan penulisan ulang URL, tetapi ya: Anda harus memiliki kendali atas pengaturan DNS Anda sehingga ketika seorang pengguna ditambahkan ia mendapat subdomain sendiri.


4

Selain perubahan konfigurasi pada server WWW Anda untuk menangani subdomain baru, kode Anda harus membuat perubahan pada catatan DNS Anda. Jadi, kecuali Anda menjalankan BIND Anda sendiri (atau serupa), Anda harus mencari cara untuk mengakses konfigurasi penyedia server nama Anda. Jika mereka tidak menawarkan semacam API, ini mungkin rumit.

Pembaruan: ya, saya akan memeriksa dengan registrar Anda jika mereka juga menyediakan layanan server nama (seperti yang sering terjadi). Saya belum pernah menjelajahi opsi ini sebelumnya, tetapi saya menduga sebagian besar pendaftar konsumen tidak. Saya mencari Google untuk GoDaddy APIs dan GoDaddy DNS APIs tetapi tidak dapat mengubah apa pun, jadi saya kira pilihan terbaik adalah memeriksa bantuan online dengan penyedia Anda, dan jika itu tidak menjawab pertanyaan, tunggu sebentar dari staf pendukung mereka.


3

Pertama, Anda perlu memastikan server Anda dikonfigurasi untuk mengizinkan subdomain wildcard. Saya mencapainya di JustHost dengan membuat subdomain bernama secara manual *. Saya juga menentukan folder yang disebut subdomainssebagai root dokumen untuk subdomain wildcard. Tambahkan ini ke .htaccessfile di folder subdomain Anda:

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

Akhirnya, yang perlu Anda lakukan adalah membuat folder di folder subdomain Anda, lalu letakkan file subdomain di direktori itu.


3

Ini dapat dicapai .htaccessjika server Anda dikonfigurasi untuk memungkinkan subdomain wildcard. Saya mencapainya di JustHost dengan membuat subomain yang dinamai secara manual *dan menetapkan folder yang disebut subdomain sebagai root dokumen untuk subdomain wildcard. Tambahkan ini ke .htaccessfile Anda :

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

Terakhir, buat folder untuk subdomain Anda dan tempatkan file subdomain.


1

Saya hanya ingin menambahkan, bahwa jika Anda menggunakan CloudFlare (gratis), Anda dapat menggunakan API mereka untuk mengelola dns Anda dengan mudah.


0

Buat Subdomain Dinamis menggunakan PHP dan Htaccess

(1) Root .htaccess

File ini adalah pengalihan http://www.yourwebsite.com ke http://yourwebsite.com untuk penggunaan beranda. Semua pengalihan subdomain ke yourwebsite_folder

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) Di dalam Folder .htaccess

File ini menulis ulang url subdomain.

http://yourwebsite.com/index.php?siteName=9lessons ke 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

Lebih banyak .htaccess tips: Tutorial dan Tips File Htaccess.

index.php

File ini berisi kode PHP sederhana, menggunakan ekspresi reguler yang memvalidasi nilai subdomain.

<?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>

Tidak Ada Folder Subdomain

Jika Anda menggunakan direktori root (htdocs / public_html) sebagai direktori proyek, gunakan file .htaccess berikut ini.

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.