Virtualhost에 대한 DocumentRoot 재작성의 와일드카드

Virtualhost에 대한 DocumentRoot 재작성의 와일드카드

와일드카드 하위 도메인에 대해 apache2에서 이 구성을 사용하고 잘 작동합니다.

 <VirtualHost _default_:80>
   UseCanonicalName off
   Options FollowSymLinks
   VirtualDocumentRoot /var/www/domains/%0/httpdocs

    RewriteEngine On

    RewriteCond   %{HTTP_HOST}      ^\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
    RewriteRule   ^(.+)             /var/www/domains/localhost/httpdocs/$1 [L]

    RewriteCond   %{HTTP_HOST}      !^[^.]+\.abc\.net [NC]
    RewriteCond   %{HTTP_HOST}      !^[^.]+\.example\.me [NC]
    RewriteCond   %{HTTP_HOST}      !^[^.]+\.mysite\.info [NC]
    RewriteCond   %{HTTP_HOST}      !^[^.]+\.xyz\.org [NC]
    RewriteCond   %{HTTP_HOST}      !\.internal$ [NC]
    RewriteCond   %{REQUEST_URI}    !^/collateral/ [NC]

    RewriteRule   ^(.+)             /var/www/domains/%{HTTP_HOST}/httpdocs/%{HTTP_HOST}/$1
    ErrorDocument 403 /error/404.php

"라는 요청을 의미합니다.http://sub.abc.net"는 문서 루트 "/var/www/domains/sub.abc.net/httpdocs"를 가져오고 "에 대해 요청합니다.http://sub.xyz.org"는 문서 루트 "/var/www/domains/sub.xyz.org/httpdocs"를 가져옵니다.

하지만 *.abc.net에 대한 요청이 *.xyz.org documentroot로 다시 작성되기를 바랍니다.

답변1

모든 도메인이 도메인 documentroot .org로 리디렉션되어야 합니다..net

나는 당신이 "다시 쓰기"를 의미한다고 가정합니다.외부 "리디렉션", 질문의 코드가 마음에 드시나요? (또한 귀하의 질문에 명시된 대로 필요한 재작성 방향을 바꾸었지만 어쨌든 의견에 언급한 내용을 .org`.net으로 따르겠습니다.)

이는 코드(예: .net, .me, .info, .org등)에서 참조된 대로 단일 수준 TLD만 있고 와 같은 다중 수준 "TLD"는 없다고 가정합니다 .co.uk.

RewriteCond   %{HTTP_HOST}      !^[^.]+\.abc\.net [NC]
RewriteCond   %{HTTP_HOST}      !^[^.]+\.example\.me [NC]
RewriteCond   %{HTTP_HOST}      !^[^.]+\.mysite\.info [NC]
RewriteCond   %{HTTP_HOST}      !^[^.]+\.xyz\.org [NC]
RewriteCond   %{HTTP_HOST}      !\.internal$ [NC]
RewriteCond   %{REQUEST_URI}    !^/collateral/ [NC]
RewriteRule   ^(.+)             /var/www/domains/%{HTTP_HOST}/httpdocs/%{HTTP_HOST}/$1

대신 다음과 같이 시도해 보세요.

# If any of these domains are requested then stop
RewriteCond %{HTTP_HOST}      ^[^.]+\.abc\.net [NC,OR]
RewriteCond %{HTTP_HOST}      ^[^.]+\.example\.me [NC,OR]
RewriteCond %{HTTP_HOST}      ^[^.]+\.mysite\.info [NC,OR]
RewriteCond %{HTTP_HOST}      ^[^.]+\.xyz\.org [NC,OR]
RewriteCond %{HTTP_HOST}      \.internal$ [NC,OR]
RewriteCond %{REQUEST_URI}    ^/collateral/ [NC]
RewriteRule ^ - [L]

# Split the requested host into HOSTNAME + TLD (env vars)
RewriteCond %{HTTP_HOST} ^([^.]+\.[^.]+)\.([^.]+)
RewriteRule ^ - [E=HOSTNAME:%1,E=TLD:%2]

# Change TLD "org" to "net"
RewriteCond %{ENV:TLD} =org [NC]
RewriteRule ^ - [E=TLD:net]

RewriteRule (.+) /var/www/domains/%{ENV:HOSTNAME}.%{ENV:TLD}/httpdocs/%{ENV:HOSTNAME}.%{ENV:TLD}/$1 [L]

첫 번째 지시문 블록은 현재 상태를 반전시킵니다. 즉. 요청이 "이 도메인"에 대한 것이라면 처리를 중지하는 대신... 요청이 수행될 때만 다시 작성하라는 메시지가 표시됩니다.~ 아니다"이 도메인" 중 하나와 일치합니다. 이제 요청된 호스트가 다시 작성하려는 호스트임을 알고 있으므로 더 많은 조건으로 코드를 어지럽힐 필요가 없으므로 다음 규칙이 더 간단해집니다.

그런 다음 요청한 내용 HTTP_HOST호스트 이름(하위 도메인 + 도메인) 및텔드오직. 그리고 이를 각각 HOSTNAME및 두 개의 환경 변수에 저장합니다 .TLD

그런 다음 env var를 테스트하고 TLD필요한 경우 이를 변경합니다(예: orgnet).

마지막으로 코드에서와 같이 적절한 문서 루트 및 하위 디렉터리(위에 할당된 환경 변수 사용)에 무조건 다시 작성됩니다. 설명에 "문서 루트"만 명시했지만 코드에 동일한 이름의 하위 디렉터리도 포함되어 있으므로 해당 하위 디렉터리도 포함했습니다.

이는 귀하의 질문에 명시된 mod_rewrite 지시문이 완전하다고 가정합니다. 즉. 구성 아래에 다른 종속 지시문이 없습니까? L좋은 측정을 위해 플래그를 추가했습니다 .

관련 정보