จะให้ PHP สร้างโดเมนย่อยโดยอัตโนมัติสำหรับผู้ใช้แต่ละคนได้อย่างไร


162

ฉันจะสร้างโดเมนย่อยเช่นhttp://user.mywebsite.com ได้อย่างไร ฉันต้องเข้าใช้ htaccess หรือไม่? จริงๆแล้วมันเป็นไปได้ที่จะสร้างมันขึ้นมาด้วยรหัส PHP บริสุทธิ์หรือฉันต้องใช้ภาษาสคริปต์เซิร์ฟเวอร์ภายนอก?

สำหรับผู้ที่ตอบว่า: งั้นฉันควรถามโฮสติ้งของฉันว่าพวกเขาให้การเข้าถึง DNS บางประเภทหรือไม่?


อาจไม่จำเป็นต้องถามผู้ให้บริการของคุณสำหรับการเข้าถึง DNS เนื่องจากการกำหนดเส้นทางย่อย (คำตอบของ Mark) เปิดใช้งานแล้ว! เพียงลองในเบราว์เซอร์ของคุณหากโดเมนย่อยให้ผลลัพธ์แก่คุณ แล้วกำหนดเส้นทางด้วยไฟล์. htaccess
powtac

หากคุณสามารถใช้นี้สามารถทำได้ในwildcard subdomains .htaccessดูวิธีแก้ปัญหาของฉัน
Dan Bray

คำตอบ:


135

คุณกำลังมองหาที่จะสร้างที่กำหนดเองบันทึก

ฉันค่อนข้างมั่นใจว่าคุณสามารถใช้อักขระตัวแทนเมื่อระบุระเบียน A ซึ่งจะช่วยให้คุณทำสิ่งนี้:

*.mywebsite.com       IN  A       127.0.0.1

127.0.0.1 จะเป็นที่อยู่ IP ของเว็บเซิร์ฟเวอร์ของคุณ วิธีการเพิ่มการบันทึกจริงขึ้นอยู่กับโฮสต์ของคุณ


การทำเช่นhttp://mywebsite.com/userจะง่ายต่อการตั้งค่าหากเป็นตัวเลือก

จากนั้นคุณสามารถเพิ่มไฟล์. htaccess ที่มีลักษณะดังนี้:

Options +FollowSymLinks

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

ในข้างต้นชื่อผู้ใช้จะถูก จำกัด ที่อักขระ az


กฎการเขียนซ้ำสำหรับการจับโดเมนย่อยจะเป็นดังนี้:

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

1
เว้นแต่ว่าแต่ละโดเมนย่อยจะเสิร์ฟจากเซิร์ฟเวอร์ที่แตกต่างกันฉันจะสร้างชื่อ Canonical Name (CNAME) เป็นแผนที่ดีกว่า en.wikipedia.org/wiki/List_of_DNS_record_types
theraccoonbear

โดเมนย่อยดูดี จะเป็นเรื่องที่ต้องทำมากขึ้นในการตั้งค่าเนื่องจากคุณจะต้องตรวจสอบให้แน่ใจว่าคำขอโดเมนย่อยทั้งหมดได้รับการจัดการอย่างถูกต้อง สิ่งนี้ไม่น่ากลัวสำหรับ Apache แต่อาจยุ่งยากในสภาพแวดล้อมที่โฮสต์
Mark Biek

@theraccoonbear สมมติว่าคุณสามารถใช้ wildcard กับ CNAME ได้เช่นกันนั่นเป็นความคิด
Mark Biek

3
ฉันควรจะเจาะจงมากขึ้น .htaccess สำหรับ Apache ไม่ใช่ IIS ฉันไม่แน่ใจว่าวิธีจัดการการเขียน url ใหม่ด้วย IIS แต่ฉันเชื่อว่ามีคำถามบางอย่างเกี่ยวกับเรื่องนี้ใน SO
Mark Biek

1
สวัสดีเครื่องหมายฉันทำตามขั้นตอนที่คุณให้ไว้ข้างต้น แต่เมื่อฉันทำxyz.mydomain.comจะเปลี่ยนเส้นทางไปยังxyz.mydomain.com/cgi-sys/defaultwebpage.cgi ... ฉันต้องทำสิ่งใดแล้วขั้นตอนที่กล่าวถึงข้างต้น ?
Ashish Rajan

30

คุณลักษณะที่คุณมีอยู่หลังจากที่เรียกว่าWildcard ย่อย ช่วยให้คุณไม่ต้องตั้งค่า DNS สำหรับแต่ละโดเมนย่อยและใช้ apache rewrites เพื่อเปลี่ยนเส้นทางแทน คุณสามารถหาบทช่วยสอนที่ดีได้ที่นี่แต่มีบทเรียนมากมายที่นั่น นี่คือรหัสที่จำเป็นจากบทช่วยสอนนั้น:

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

อย่างไรก็ตามเมื่อต้องการใช้ VirtualHosts จะต้องตั้งค่าในไฟล์ httpd.conf ของเซิร์ฟเวอร์แทนที่จะเป็น. htaccess ในเครื่อง


ฉันไม่สามารถเข้าถึงไฟล์ httpd.conf ได้เนื่องจากฉันอยู่ในพื้นที่สาธารณะ ฉันจะทำอย่างไร
Webber Depor

23

ฉันทำมันแตกต่างจากมาร์คเล็กน้อย ฉันผ่านโดเมนทั้งหมดและคว้าโดเมนย่อยเป็น php

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

สิ่งนี้จะไม่สนใจรูปภาพและแมปทุกอย่างอื่นไปยังไฟล์ index.php ของฉัน ดังนั้นถ้าฉันไป

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

ฉันกลับมาแล้ว

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

จากนั้นในรหัส index.php ของฉันฉันเพิ่งระเบิดชื่อผู้ใช้ของฉันออกจากชื่อโฮสต์ มันทำให้ URL SEO ของฉันสวย


14

เราตั้งค่า wildcard DNS ตามที่อธิบายไว้ข้างต้น ดังนั้นบันทึกจึงเป็น * .yourname.com

จากนั้นโดเมนย่อยทั้งหมดจะไปที่เดียวกัน แต่ PHP ถือว่าแต่ละโดเมนย่อยเป็นบัญชีอื่น

เราใช้รหัสต่อไปนี้:

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

รหัสนี้เพียงแค่ตั้งค่า$accountตัวแปรเช่นเดียวกับโดเมนย่อย จากนั้นคุณสามารถเรียกดูไฟล์และข้อมูลอื่น ๆ ตามบัญชีของพวกเขา

วิธีนี้อาจไม่ได้ผลเท่าที่ระบุไว้ข้างต้น แต่ถ้าคุณไม่สามารถเข้าถึง BIND และ / หรือ จำกัด . htaccess วิธีนี้ควรใช้งานได้ (ตราบเท่าที่โฮสต์ของคุณจะตั้งค่าไวด์การ์ดให้คุณ)

เราใช้วิธีนี้ในการเชื่อมต่อกับฐานข้อมูลลูกค้าสำหรับแอปพลิเคชันอีคอมเมิร์ซที่มีหลาย บริษัท แต่มันก็ใช้ได้สำหรับคุณเช่นกัน


2
ฉันคิดว่านี่น่าจะเป็นคำตอบที่ถูกต้องเมื่อถามเกี่ยวกับวิธีที่PHPจัดการกับหัวข้อย่อยไม่ว่าเว็บหรือเซิร์ฟเวอร์ DNS จะจัดการ โดเมนย่อยได้อย่างไร
เซเลม

8

อย่ายุ่งยากกับไฟล์. htaccess เมื่อคุณสามารถใช้Apache โฮสต์เสมือนจริงได้

จากเอกสาร:

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

ในทางกลับกันคำถามของคุณคือ: 'โดเมนย่อย' ทุกอันเป็นผู้ใช้ หากไม่มีผู้ใช้คุณจะได้รับ 404

ข้อเสียเปรียบเพียงอย่างเดียวคือตัวแปรสภาพแวดล้อมDOCUMENT_ROOTไม่ได้ตั้งค่าอย่างถูกต้องไปยังไดเรกทอรีย่อยที่ใช้แต่ document_root เริ่มต้นใน de htconfig


1
ฉันไม่แน่ใจจริงๆว่าจะใช้มันอย่างไร .. และสุดท้ายทำไมไม่ยุ่งกับ htaccess?
Skuta

6

โซลูชัน PHP อย่างง่ายสำหรับโดเมนย่อยและเว็บแอปหลายโดเมน

ขั้นตอนที่ 1 ระบุระเบียน DNS เป็น "*" สำหรับโดเมน (หรือโดเมน) ที่คุณจะให้บริการ "example.org"

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

ขั้นตอนที่ 2 ตรวจสอบการเข้าสู่ระบบที่ไม่ซ้ำกันเมื่อผู้ใช้ลงทะเบียนหรือเปลี่ยนการเข้าสู่ระบบ นอกจากนี้หลีกเลี่ยงจุดในการเข้าสู่ระบบเหล่านั้น

ขั้นตอน 3. จากนั้นตรวจสอบแบบสอบถาม

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

?>

โซลูชันนี้อาจแสดงโดเมนที่ต่างกัน

qwerty.example.org
qwerty.example.net 

johnsmith.somecompany.com
paulsmith.somecompany.com

หากคุณต้องการชื่อเล่นเดียวกันในโดเมนที่ต่างกันให้บริการแตกต่างกันคุณอาจต้องเลือกผู้ใช้สำหรับโดเมนเมื่อลงทะเบียนเข้าสู่ระบบ

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

4

คุณสามารถ [อาจ] ทำการเขียน URL ใหม่ แต่ใช่: คุณต้องควบคุมการตั้งค่า DNS ของคุณเพื่อที่ว่าเมื่อผู้ใช้ถูกเพิ่มมันจะได้รับโดเมนย่อยของตัวเอง


4

นอกเหนือจากการเปลี่ยนแปลงการกำหนดค่าบนเซิร์ฟเวอร์ WWW ของคุณเพื่อจัดการโดเมนย่อยใหม่รหัสของคุณจะต้องมีการเปลี่ยนแปลงระเบียน DNS ของคุณ ดังนั้นยกเว้นว่าคุณใช้ BIND ของคุณเอง (หรือคล้ายกัน) คุณจะต้องหาวิธีการเข้าถึงการกำหนดค่าของผู้ให้บริการเซิร์ฟเวอร์ชื่อของคุณ หากพวกเขาไม่เสนอ API บางประเภทสิ่งนี้อาจมีความยุ่งยาก

อัปเดต: ใช่ฉันจะตรวจสอบกับผู้รับจดทะเบียนของคุณว่าพวกเขากำลังให้บริการเนมเซิร์ฟเวอร์หรือไม่ (ตามปกติ) ฉันไม่เคยสำรวจตัวเลือกนี้มาก่อน แต่สงสัยว่าผู้บริโภคส่วนใหญ่จะไม่ทำเช่นนี้ ฉัน Googled สำหรับ GoDaddy APIs และ GoDaddy DNS API แต่ไม่สามารถเปิดใช้งานได้ดังนั้นฉันเดาตัวเลือกที่ดีที่สุดคือการตรวจสอบความช่วยเหลือออนไลน์กับผู้ให้บริการของคุณและหากไม่สามารถตอบคำถามได้ ของพนักงานให้ความช่วยเหลือ


3

ขั้นแรกคุณต้องตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ของคุณได้รับการกำหนดค่าให้อนุญาตโดเมนย่อยแบบไวด์การ์ด ผมประสบความสำเร็จว่าใน JustHost โดยการสร้าง subomain *ที่มีชื่อตนเอง ฉันยังระบุโฟลเดอร์ที่เรียกว่าsubdomainsเป็นรากของเอกสารสำหรับโดเมนย่อยไวด์การ์ด เพิ่มลง.htaccessในไฟล์ในโฟลเดอร์ย่อยของคุณ:

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

สุดท้ายสิ่งที่คุณต้องทำคือสร้างโฟลเดอร์ในโฟลเดอร์ย่อยจากนั้นวางไฟล์ของโดเมนย่อยในไดเรกทอรีนั้น


3

ซึ่งสามารถทำได้ในกรณีที่.htaccessเซิร์ฟเวอร์ของคุณได้รับการกำหนดค่าให้อนุญาตโดเมนย่อยแบบไวด์การ์ด ฉันประสบความสำเร็จใน JustHost ด้วยการสร้างชื่อ*โดเมนย่อยด้วยตนเองและระบุโฟลเดอร์ที่เรียกว่าโดเมนย่อยเป็นรูทเอกสารสำหรับโดเมนย่อยไวด์การ์ด เพิ่มลงใน.htaccessไฟล์ของคุณ:

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

สุดท้ายสร้างโฟลเดอร์สำหรับโดเมนย่อยของคุณและวางไฟล์ย่อย


1

ฉันแค่อยากจะเพิ่มว่าถ้าคุณใช้ CloudFlare (ฟรี) คุณสามารถใช้ API เพื่อจัดการ DNS ของคุณได้อย่างง่ายดาย


0

สร้างโดเมนย่อยแบบไดนามิกโดยใช้ PHP และ Htaccess

(1) รูท. htaccess

ไฟล์นี้ถูกเปลี่ยนเส้นทางhttp://www.yourwebsite.comไปยังhttp://yourwebsite.comสำหรับการใช้หน้าแรก การเปลี่ยนเส้นทางโดเมนย่อยทั้งหมดไปยัง 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) ภายในโฟลเดอร์. htaccess

ไฟล์นี้กำลังเขียน URL ย่อย

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

เคล็ดลับ. htaccess เพิ่มเติม: บทแนะนำและเคล็ดลับไฟล์ Htaccess

index.php

ไฟล์นี้มีรหัส PHP อย่างง่ายโดยใช้การแสดงออกปกติตรวจสอบค่าโดเมนย่อย

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

ไม่มีโฟลเดอร์ย่อย

หากคุณใช้ไดเรกทอรีราก (htdocs / public_html) เป็นไดเรกทอรีโครงการให้ใช้ไฟล์. htaccess ต่อไปนี้

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.