Làm cách nào để PHP tự động tạo tên miền phụ cho mỗi người dùng?


162

Làm cách nào để tạo tên miền phụ như http://user.mywebsite.com ? Tôi có phải truy cập htaccess bằng cách nào đó? Có thực sự đơn giản là có thể tạo nó thông qua mã php thuần túy hay tôi cần sử dụng một số ngôn ngữ bên máy chủ script bên ngoài?

Đối với những người trả lời: Chà, sau đó, tôi có nên hỏi hosting của tôi nếu họ cung cấp một số loại quyền truy cập DNS ??


Có lẽ không bắt buộc phải yêu cầu nhà cung cấp của bạn truy cập DNS, vì định tuyến tên miền phụ (câu trả lời của Mark) đã được kích hoạt! Chỉ cần thử trong trình duyệt của bạn nếu tên miền phụ cho bạn một kết quả. Và sau đó định tuyến chúng với tệp .htaccess.
powtac

Nếu bạn có thể sử dụng wildcard subdomainsđiều này có thể đạt được trong .htaccess. Xem giải pháp của tôi.
Dan Bray

Câu trả lời:


135

Bạn đang tìm cách tạo một bản ghi A tùy chỉnh .

Tôi khá chắc chắn rằng bạn có thể sử dụng các ký tự đại diện khi chỉ định các bản ghi A sẽ cho phép bạn làm một cái gì đó như thế này:

*.mywebsite.com       IN  A       127.0.0.1

127.0.0.1 sẽ là địa chỉ IP của máy chủ web của bạn. Phương pháp thực sự thêm bản ghi sẽ phụ thuộc vào máy chủ của bạn.


Làm như http://mywebsite.com/user sẽ dễ dàng hơn để thiết lập nếu đó là một tùy chọn.

Sau đó, bạn có thể chỉ cần thêm một tệp .htaccess trông như thế này:

Options +FollowSymLinks

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

Ở trên, tên người dùng được giới hạn ở các ký tự az


Quy tắc viết lại để lấy tên miền phụ sẽ như thế này:

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

1
Trừ khi mỗi tên miền phụ được phục vụ từ một máy chủ khác nhau, tôi sẽ tạo các bản ghi Canonical Name (CNAME) sẽ là một kế hoạch tốt hơn. vi.wikipedia.org/wiki/List_of_DNS_record_types
Theraccoonbear

Tên miền phụ trông đẹp. Mặc dù vậy, sẽ rất nhiều việc phải thiết lập vì bạn sẽ phải đảm bảo rằng tất cả các yêu cầu tên miền phụ được xử lý đúng cách. Điều này không tệ với Apache nhưng có thể khó khăn trong môi trường được lưu trữ.
Đánh dấu Biek

@theraccoonbear Giả sử bạn cũng có thể sử dụng ký tự đại diện với CNAME, đó là một suy nghĩ.
Đánh dấu Biek

3
Tôi cần phải có được cụ thể hơn. .htaccess dành cho Apache, không phải IIS. Tôi không chắc cách viết lại url được xử lý với IIS nhưng tôi tin rằng đã có một số câu hỏi về SO trên đó.
Đánh dấu Biek

1
xin chào, tôi đã làm theo các bước bạn đã đưa ra ở trên nhưng khi tôi làm xyz.mydomain.com thì nó chuyển hướng đến xyz.mydomain.com/cgi-sys/defaultwebpage.cgi ... Tôi có cần phải làm gì khác không? ?
Ashish Rajan

30

Tính năng bạn theo đuổi được gọi là Tên miền con Wildcard . Nó cho phép bạn không phải thiết lập DNS cho mỗi tên miền phụ, và thay vào đó sử dụng viết lại apache cho chuyển hướng. Bạn có thể tìm thấy một hướng dẫn tốt đẹp ở đây , nhưng có hàng ngàn hướng dẫn ngoài kia. Đây là mã cần thiết từ hướng dẫn đó:

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

Tuy nhiên, vì nó yêu cầu sử dụng Virtualhost, nó phải được đặt trong tệp httpd.conf của máy chủ, thay vì .htaccess cục bộ.


Tôi không thể truy cập tệp httpd.conf vì tôi đang lưu trữ chia sẻ. tôi có thể làm gì?
Webber Depor

23

Tôi làm nó hơi khác với Mark. Tôi vượt qua toàn bộ tên miền và lấy tên miền phụ trong php.

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

Điều này bỏ qua hình ảnh và ánh xạ mọi thứ khác vào tệp index.php của tôi. Vì vậy, nếu tôi đi đến

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

Tôi trở lại

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

Sau đó, trong mã index.php của tôi, tôi chỉ nổ tên người dùng khỏi tên máy chủ. Điều này mang lại cho tôi các URL SEO khá đẹp.


14

Chúng tôi thiết lập DNS ký tự đại diện như họ đã giải thích ở trên. Vì vậy, một bản ghi là * .yourname.com

Sau đó, tất cả các tên miền phụ thực sự sẽ đến cùng một nơi, nhưng PHP coi mỗi tên miền phụ là một tài khoản khác nhau.

Chúng tôi sử dụng mã sau đây:

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

Mã này chỉ đặt $accountbiến giống như tên miền phụ. Sau đó, bạn có thể truy xuất tệp của họ và thông tin khác dựa trên tài khoản của họ.

Điều này có thể không hiệu quả như những cách họ liệt kê ở trên, nhưng nếu bạn không có quyền truy cập vào BIND và / hoặc .htaccess thì phương pháp này sẽ hoạt động (miễn là máy chủ của bạn sẽ thiết lập ký tự đại diện cho bạn).

Chúng tôi thực sự sử dụng phương pháp này để kết nối với cơ sở dữ liệu khách hàng cho một ứng dụng thương mại điện tử của nhiều công ty, nhưng nó cũng có thể phù hợp với bạn.


2
Tôi nghĩ rằng đây có thể là câu trả lời chính xác, vì op hỏi về cách PHP xử lý các chuỗi con KHÔNG phải như thế nào Máy chủ web hoặc DNS xử lý các tên miền phụ.
Salem

8

Đừng loay hoay với các tệp .htaccess khi bạn có thể sử dụng lưu trữ ảo hàng loạt Apache .

Từ tài liệu:

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

Theo một cách nào đó, nó ngược lại với câu hỏi của bạn: mọi 'tên miền phụ' là một người dùng. Nếu người dùng không tồn tại, bạn nhận được 404.

Hạn chế duy nhất là biến môi trường DOCUMENT_ROOTkhông được đặt chính xác thành thư mục con được sử dụng , mà là document_root mặc định trong de htconfig.


1
Tôi không thực sự chắc chắn làm thế nào để sử dụng nó .. và cuối cùng, tại sao không làm phiền với htaccess?
Skuta

6

Giải pháp PHP đơn giản cho tên miền phụ và ứng dụng web đa miền

Bước 1. Cung cấp DNS Một bản ghi là "*" cho các tên miền (hoặc tên miền) bạn sẽ phục vụ "example.org"

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

Bước 2. Kiểm tra tính duy nhất của thông tin đăng nhập khi người dùng đăng ký hoặc thay đổi đăng nhập. Ngoài ra, tránh các dấu chấm trong những lần đăng nhập đó.

Bước 3. Sau đó kiểm tra truy vấn

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

?>

Giải pháp này có thể phục vụ các tên miền khác nhau

qwerty.example.org
qwerty.example.net 

johnsmith.somecompany.com
paulsmith.somecompany.com

Nếu bạn cần cùng một tên miền trên các tên miền khác nhau được phục vụ khác nhau, bạn có thể cần lưu trữ lựa chọn người dùng cho tên miền khi đăng ký đăng nhập.

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

4

Bạn có thể [có khả năng] thực hiện viết lại URL, nhưng có: bạn phải có quyền kiểm soát cài đặt DNS của mình để khi người dùng được thêm, nó sẽ có tên miền phụ.


4

Ngoài các thay đổi về cấu hình trên máy chủ WWW của bạn để xử lý tên miền phụ mới, mã của bạn sẽ cần thực hiện các thay đổi đối với bản ghi DNS của bạn. Vì vậy, trừ khi bạn đang chạy BIND của riêng bạn (hoặc tương tự), bạn sẽ cần tìm ra cách truy cập cấu hình của nhà cung cấp máy chủ tên của bạn. Nếu họ không cung cấp một số loại API, điều này có thể gặp khó khăn.

Cập nhật: có, tôi sẽ kiểm tra với nhà đăng ký của bạn nếu họ cũng cung cấp dịch vụ máy chủ tên (như thường lệ). Tôi chưa bao giờ khám phá tùy chọn này trước đây nhưng tôi nghi ngờ hầu hết các nhà đăng ký người tiêu dùng thì không. Tôi đã tìm kiếm API GoDaddy và API DNS của GoDaddy nhưng không thể bật bất cứ thứ gì lên, vì vậy tôi đoán tùy chọn tốt nhất sẽ là kiểm tra trợ giúp trực tuyến với nhà cung cấp của bạn và nếu điều đó không trả lời câu hỏi, hãy giữ lại của nhân viên hỗ trợ của họ.


3

Trước tiên, bạn cần đảm bảo rằng máy chủ của bạn được cấu hình để cho phép các tên miền phụ ký tự đại diện. Tôi đã đạt được điều đó trong Justhost bằng cách tạo một tên miền phụ được đặt tên thủ công *. Tôi cũng đã chỉ định một thư mục được gọi subdomainslà gốc tài liệu cho các tên miền phụ ký tự đại diện. Thêm phần này vào một .htaccesstệp trong thư mục tên miền phụ của bạn:

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

Cuối cùng, tất cả những gì bạn cần làm là tạo một thư mục trong thư mục tên miền phụ của bạn, sau đó đặt các tệp của tên miền phụ vào thư mục đó.


3

Điều này có thể đạt được với .htaccessđiều kiện máy chủ của bạn được cấu hình để cho phép các tên miền phụ ký tự đại diện. Tôi đã đạt được điều đó trong Justhost bằng cách tạo một *tên miền phụ được đặt tên thủ công và chỉ định thư mục được gọi là tên miền phụ làm gốc tài liệu cho tên miền phụ ký tự đại diện. Thêm phần này vào .htaccesstập tin của bạn :

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

Cuối cùng, tạo một thư mục cho tên miền phụ của bạn và đặt các tệp tên miền phụ.


1

Tôi chỉ muốn thêm rằng, nếu bạn sử dụng CloudFlare (miễn phí), bạn có thể sử dụng API của họ để quản lý dns của bạn một cách dễ dàng.


0

Tạo các tên miền con động bằng PHP và Htaccess

(1) Root .htaccess

Tập tin này được chuyển hướng http://www.yourwebsite.com sang http://yourwebsite.com để sử dụng trang chủ. Tất cả các chuyển hướng tên miền phụ đến 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) Thư mục bên trong .htaccess

Tập tin này đang viết lại các url tên miền phụ.

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

Thêm mẹo .htaccess : Hướng dẫn và Mẹo về Tập tin Htaccess.

index.php

Tệp này chứa mã PHP đơn giản, sử dụng các biểu thức chính quy xác nhận giá trị tên miền phụ.

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

Không có thư mục tên miền con

Nếu bạn đang sử dụng thư mục gốc (htdocs / public_html) làm thư mục dự án, hãy sử dụng tệp .htaccess sau đây.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.