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.