PHP가 각 사용자에 대해 자동으로 하위 도메인을 만들도록하는 방법은 무엇입니까?


162

http://user.mywebsite.com 과 같은 하위 도메인을 어떻게 만듭니 까? 어떻게 든 htaccess에 액세스해야합니까? 순수한 PHP 코드를 통해 실제로 만들 수 있습니까? 아니면 외부 스크립트 서버 측 언어를 사용해야합니까?

대답 한 사람들에게 : 그렇다면 호스팅에 DNS 액세스를 제공하는지 물어봐야합니까?


하위 도메인 라우팅 (Mark의 답변)이 이미 활성화되었으므로 공급자에게 DNS 액세스를 요청하지 않아도됩니다. 하위 도메인이 결과를 제공하는 경우 브라우저에서 시도하십시오. 그런 다음 .htaccess 파일로 라우팅하십시오.
— powtac

사용할 wildcard subdomains수있는 경우에서 달성 할 수 있습니다 .htaccess. 내 솔루션을 참조하십시오.
— Dan Bray

답변:


135

사용자 정의 A 레코드 를 작성하려고 합니다.

다음과 같이 할 수있는 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
각 하위 도메인이 다른 서버에서 제공되지 않는 한 정식 이름 (CNAME) 레코드를 만드는 것이 더 나은 계획이 될 것입니다. en.wikipedia.org/wiki/List_of_DNS_record_types
— theraccoonbear

하위 도메인이 멋지게 보입니다. 모든 하위 도메인 요청이 올바르게 처리되도록해야하기 때문에 설정 작업이 훨씬 더 많아 질 것입니다. 이것은 Apache에서는 끔찍하지 않지만 호스팅 환경에서는 까다로울 수 있습니다.
— Mark Biek

@theraccoonbear CNAME과 함께 와일드 카드를 사용할 수 있다고 가정하면 생각입니다.
— Mark Biek

3
좀 더 구체적 이었어 야 했어요 .htaccess는 IIS가 아닌 Apache 용입니다. URL 재 작성이 IIS에서 어떻게 처리되는지 잘 모르겠지만 SO에 대해 몇 가지 질문이 있다고 생각합니다.
— Mark Biek

1
안녕하세요 마크, 난 당신이 위의 준 단계를 수행하지만, 내가 할 때 xyz.mydomain.com 가로 리디렉션 xyz.mydomain.com/cgi-sys/defaultwebpage.cgi ... 마 I의 필요가 무엇이든은 다른 후 위에서 언급 한 단계들 ?
— Ashish Rajan

30

당신이 추구 하는 기능을 와일드 카드 하위 도메인 이라고 합니다. 각 하위 도메인에 대해 DNS를 설정할 필요가 없으며 대신 리디렉션에 아파치 다시 쓰기를 사용하십시오. 여기서 훌륭한 튜토리얼을 찾을 수 있지만 수천 개의 튜토리얼이 있습니다. 해당 튜토리얼에서 필요한 코드는 다음과 같습니다.

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

그러나 VirtualHost를 사용해야하므로 로컬 .htaccess 대신 서버의 httpd.conf 파일에 설정해야합니다.


공유 호스팅 상태이므로 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 코드에서 hostName에서 내 사용자 이름을 폭발시킵니다. 이것은 나에게 예쁜 SEO URL을 제공합니다.


14

위에서 설명한대로 와일드 카드 DNS를 설정했습니다. 레코드는 * .yourname.com입니다.

그런 다음 모든 하위 도메인이 실제로 동일한 위치로 이동하지만 PHP는 각 하위 도메인을 다른 계정으로 취급합니다.

우리는 다음 코드를 사용합니다 :

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

이 코드는 $account변수를 하위 도메인과 동일하게 설정합니다 . 그런 다음 계정을 기반으로 파일 및 기타 정보를 검색 할 수 있습니다.

이것은 위에 나열된 방법만큼 효과적이지 않지만 BIND 및 / 또는 제한된 .htaccess에 액세스 할 수없는 경우이 방법이 작동합니다 (호스트가 와일드 카드를 설정하는 한).

실제로이 방법을 사용하여 여러 회사 전자 상거래 응용 프로그램의 고객 데이터베이스에 연결하지만 사용자에게도 도움이 될 수 있습니다.


2
웹이나 DNS 서버가 서브 도메인을 처리 하는 방법이 아니라 PHP 가 서브 디모 인을 처리 하는 방법에 대해 물어 보는 것과 같이, 나는 이것이 정답이라고 생각한다 .
— Salem

8

Apache 대량 가상 호스팅을 사용할 수있을 때 .htaccess 파일을 사용하지 마십시오 .

설명서에서 :

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

어떤 식 으로든 그것은 당신의 질문의 반대입니다 : 모든 '하위 도메인'은 사용자입니다. 사용자가 존재하지 않으면 404를받습니다.

유일한 단점은 환경 변수 DOCUMENT_ROOT가 사용 된 서브 디렉토리로 올바르게 설정되지 않았지만 de htconfig의 기본 document_root입니다.


1
나는 그것을 어떻게 사용하는지 잘 모르겠다. 그리고 결국, 왜 htaccess를 망쳐 놓지 않겠는가?
— Skuta

6

하위 도메인 및 다중 도메인 웹 앱을위한 간단한 PHP 솔루션

1 단계. "example.org"를 제공 할 도메인 (또는 도메인)에 대해 DNS A 레코드를 "*"로 제공

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를 제공하지 않으면 까다로울 수 있습니다.

업데이트 : 예, 등록 기관에서 네임 서버 서비스를 제공하고 있는지 확인합니다 (종종 경우). 필자는이 옵션을 한번도 살펴본 적이 없지만 대부분의 소비자 등록 기관은 그렇지 않다고 생각합니다. GoDaddy API 및 GoDaddy DNS API를 Google에서 검색했지만 아무 것도 설정하지 못했습니다. 따라서 가장 좋은 방법은 서비스 제공 업체의 온라인 도움말을 확인하는 것이 가장 좋습니다. 그들의 지원 직원의.


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 to 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.