와일드카드 하위 도메인에 대해 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
필요한 경우 이를 변경합니다(예: org
로 net
).
마지막으로 코드에서와 같이 적절한 문서 루트 및 하위 디렉터리(위에 할당된 환경 변수 사용)에 무조건 다시 작성됩니다. 설명에 "문서 루트"만 명시했지만 코드에 동일한 이름의 하위 디렉터리도 포함되어 있으므로 해당 하위 디렉터리도 포함했습니다.
이는 귀하의 질문에 명시된 mod_rewrite 지시문이 완전하다고 가정합니다. 즉. 구성 아래에 다른 종속 지시문이 없습니까? L
좋은 측정을 위해 플래그를 추가했습니다 .