Tạo tên miền phụ nhanh chóng với .htaccess (PHP)


122

Tôi đang tìm cách tạo một hệ thống mà khi đăng ký sẽ tạo một miền phụ trên trang web của tôi cho khu vực tài khoản người dùng.

ví dụ: johndoe.website.com

Tôi nghĩ rằng nó sẽ là một cái gì đó để làm với tệp .htaccess và có thể chuyển hướng đến một vị trí khác trên trang web? Tôi thực sự không biết. Nhưng bất kỳ thông tin nào để tôi bắt đầu sẽ được đánh giá rất cao.

Tạo khu vực đăng ký không phải là vấn đề - tôi đã làm việc này nhiều lần. Tôi chỉ không chắc nên bắt đầu từ đâu với miền phụ.

Câu trả lời:


125

Tóm tắt nhanh chóng

  1. Bạn cần tạo miền ký tự đại diện trên máy chủ DNS của mình * .website.com
  2. Sau đó, trong vùng chứa vhost của bạn, bạn cũng sẽ cần chỉ định ký tự đại diện * .website.com - Điều này được thực hiện trong ServerAlias DOC
  3. Sau đó giải nén và xác minh tên miền phụ trong PHP và hiển thị dữ liệu thích hợp

Phiên bản dài

1. Tạo mục nhập DNS ký tự đại diện

Trong cài đặt DNS của mình, bạn cần tạo mục nhập miền ký tự đại diện chẳng hạn như *.example.org. Một mục nhập ký tự đại diện trông giống như sau:

*.example.org.   3600  A  127.0.0.1

2. Bao gồm ký tự đại diện trong vhost

Tiếp theo trong cấu hình Apache, bạn cần thiết lập vùng chứa vhost chỉ định ký tự đại diện trong chỉ thị ServerAlias DOCs . Một vùng chứa vhost ví dụ:

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

3. Tìm ra miền phụ bạn đang sử dụng trong PHP

Sau đó, trong các tập lệnh PHP của bạn, bạn có thể tìm ra miền bằng cách tìm kiếm $_SERVERbiến siêu toàn cục. Đây là một ví dụ về việc lấy tên miền phụ trong PHP:

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

Tôi đã sử dụng regex ở đây để cho phép mọi người truy cập trang web của bạn qua www.subdomain.example.org hoặc subdomain.example.org.

Nếu bạn không bao giờ lường trước phải đối phó với www. (hoặc các miền phụ khác) thì bạn chỉ cần sử dụng một chuỗi con như sau:

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

Lưu trữ ảo hàng loạt

Lưu trữ ảo hàng loạt là một kế hoạch hơi khác so với ở trên ở chỗ bạn thường sử dụng nó để lưu trữ nhiều trang web riêng biệt thay vì cố gắng sử dụng nó để cung cấp năng lượng cho một ứng dụng như câu hỏi đề xuất.

Tôi đã ghi lại môi trường lưu trữ ảo hàng loạt dựa trên mod_rewrite của mình trước đây trong một bài đăng trên blog của mình , bạn có thể xem xét đó có phải là lộ trình bạn muốn đi hay không. Tất nhiên, cũng có trang hướng dẫn Apache tương ứng .

Apache cũng có một cách xử lý nội bộ đối với lưu trữ ảo hàng loạt hơi kém linh hoạt hơn so với phương pháp mod_rewrite mà tôi đã sử dụng. Tất cả những điều này được mô tả trên trang hướng dẫn sử dụng Máy chủ ảo hàng loạt được cấu hình động Apache .


Với điều kiện bạn có thể sử dụng wildcard subdomains, hãy xem giải pháp của tôi để làm điều này trong .htaccess.
Dan Bray

Tôi không tin rằng một máy chủ ảo có thể được thêm vào từ .htaccess, nó cũng khiến tôi lo lắng về tính bảo mật. Từ 2.4, có thể chọn một thư mục cơ sở phụ thuộc vào tên máy (Nhưng phương pháp của Dan cũng có một số vấn đề) Hãy xem xét:RewriteRule "^/?(.*)" "http://%{HTTP_HOST}/%{HTTP_HOST}/$1" [L,R,NE]
symcbean

Lưu ý rằng mã PHP thực thi điều này KHÔNG ĐƯỢC chạy dưới dạng uid của máy chủ web (phải là người dùng chuyên dụng thông qua sudo)
symcbean

12

Bạn có thể cho phép mọi miền phụ ngay từ đầu và sau đó kiểm tra xem miền phụ có hợp lệ không. Ví dụ:

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

Bên trong, index.phpbạn có thể giải nén miền phụ bằng cách sử dụng:

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

Nhưng tất cả điều này yêu cầu máy chủ web của bạn chấp nhận mọi tên miền phụ.


3
Hơn nữa, nó yêu cầu máy chủ DNS của bạn phân giải mọi tên miền phụ.
hỗn loạn

1
Tôi đã thấy điều này được thực hiện trên các trang web khác, chắc chắn họ không phải giải quyết mọi miền phụ mọi lúc phải không?
Ben McRae

1
Vâng, nó phụ thuộc vào những gì bạn có ý nghĩa của nó. Nếu bạn có nghĩa là, mỗi khi ai đó trên internet tìm kiếm foo.somedomain.com và nó không được lưu vào bộ nhớ cache, máy chủ DNS của họ phải giải quyết nó, thì có.
hỗn loạn

Nếu bạn muốn nói, họ có phải thiết lập bản ghi DNS cụ thể cho từng miền hay không, hãy xem câu trả lời của Treffynnon.
hỗn loạn

được rồi, cảm ơn vì điều đó. Tôi không hiểu Treffynnon có nghĩa là gì khi chỉ định ký tự đại diện trong vhost?
Ben McRae


6

Tôi thấy nó dễ dàng hơn khi làm điều đó với PHP. Thực tế là tạo một tên miền phụ trong cPanel và tạo thư mục của bạn dưới tên miền mong muốn. Như bạn sẽ làm thủ công trong cPanel nhưng tất cả được thực hiện trong mili giây bởi một hàm PHP đơn giản. Không cần nhấp chuột :)

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

}

Kiểm tra xem nó có được tạo thành công trên cPanel hay không và kiểm tra bằng FTP (hoặc trình quản lý tệp), có gì bên trong thư mục public_html / subdomain. Nếu bạn có cài đặt cPanel, thêm nội dung khi bạn tạo miền phụ, điều này không liên quan đến việc tạo miền phụ nhanh chóng.
Adrian P.

Không chưa được tạo trong cPanel
Ruchi

Sau đó, bạn không có đủ quyền trên cPanel. Đây là VPS lưu trữ chia sẻ hay máy chủ chuyên dụng?
Adrian P.

Có thể do nhiều lý do dẫn đến việc không tạo miền phụ. Không liên quan đến tập lệnh ở trên nhưng với cấu hình DNS của bạn. Đọc điều đó và yêu cầu trợ giúp trên diễn đàn cPanel. Forum.cpanel.net/threads/subdomains-not-working.228132
Adrian P.

5

Cách dễ nhất là chuyển hướng tất cả các miền phụ (với ký tự đại diện *) để trỏ đến / wwwroot của bạn. Sau đó, đặt .htaccess vào thư mục này với mã sau:

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]

Điều này sẽ giúp mọi thư mục con của thư mục / wwwroot được chấp nhận thông qua tên miền phụ (foldername.domain.com).

Được tìm thấy cách đây nhiều năm trên http://www.webmasterworld.com/apache/3163397.htm


4

Nó không liên quan gì đến .htaccess. Bạn sẽ cần thiết lập bản ghi DNS và lưu trữ ảo cho các miền phụ.


4

Mod_vhost_alias là mô-đun phù hợp để làm điều này.

Với một dòng, bạn có thể yêu cầu Apache tìm đúng nơi, với băm thư mục, v.v. Ví dụ: dòng:

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

sẽ yêu cầu Apache đặt gốc tài liệu thành / http / users / s / u / subdomain khi được yêu cầu cho subdomain.yourdomain.com


0

Tôi nghĩ rằng DNS thẻ hoang dã với Máy chủ ảo Dynamic Mass của Apache cũng là một giải pháp hợp lý. Mặc dù, tôi chưa bao giờ thử nó.

Nếu bạn có nhu cầu mở rộng ra nhiều máy chủ hoặc các giải pháp khác không phù hợp với bạn, tôi khuyên bạn nên sử dụng máy chủ DNS hướng cơ sở dữ liệu. Tôi đã sử dụng MyDNS thành công trong quá khứ. Vì nó sử dụng MySQL (hoặc PostgreSQL) nên bạn có thể cập nhật DNS của mình nhanh chóng bằng PHP hoặc bất kỳ thứ gì khác. Mã trông không giống như nó đã được cập nhật trong một thời gian, nhưng đó là DNS và do đó không chính xác vượt trội.


0

Phương pháp tạo tên miền phụ ký tự đại diện

Trước tiên, bạn phải tạo cài đặt DNS bằng trình chỉnh sửa DNS máy chủ của mình.

  1. Tạo Abản ghi trong cài đặt DNS với *thẻ đại diện máy chủ lưu trữ trong địa chỉ ip máy chủ.

    * 1400 IN A ip_address

  2. Tạo lại một Abản ghi trong cài đặt DNS với máy chủ @hoặc domain_name.tldtrong địa chỉ ip máy chủ. tld có nghĩa là các miền cấp cao nhất hoặc phần mở rộng của các miền như .com, .org, v.v.

    @ 1400 IN A ip_address hoặc là domain_name.tld 1400 IN A ip_address

  3. Tạo CNAMEbản ghi như:

    www 1400 IN A domainname.tld

  4. Tạo miền phụ với *ký tự đại diện như*.domain.tld
  5. Tạo htaccess trong thư mục tên miền phụ của bạn *.domain.tldvà đặt mã này:

    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

    Kiểm tra miền phụ ký tự đại diện đầu tiên của bạn như example.domainname.tld

Nếu bạn không muốn chuyển dữ liệu dưới dạng tham số bằng htaccess, bạn cũng có thể lấy dữ liệu bằng cách sử dụng mã sau:

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

và sử dụng biến toàn cục của bạn ở bất kỳ nơi nào như global $get_data.

echo $get_data->data; //example

(lưu ý: Lớp này chủ yếu được sử dụng để lấy tên miền phụ chính xác từ http_host. bởi vì một số tên bổ sung được kết hợp trước tên miền phụ của bạn cũng có thể áp dụng như www.example.domainname.tld. Trả về này $_GET['data']='wwww'Vì vậy, đề xuất của tôi là sử dụng $_SERVER['http_host']for get các giá trị chính xác thay vì sử dụng các $_SERVER['query_string']tham số htaccess hoặc được truyền vào trang chỉ mục của bạn)

6.Tốc độ thực thi của các tên miền phụ ký tự đại diện này sử dụng N giây trong TTL - DNS SETTINGS.

7. Kiểm tra tên miền phụ sau thời gian ttl nhất định của bạn (600 - 10 phút) like => http://abc.domain.tld

(lưu ý: các tên miền phụ ký tự đại diện không ghi đè các tên miền phụ hiện có. Vì Ưu tiên hàng đầu luôn dành cho các tên miền phụ hiện có của bạn)

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.