仮想ホストの DocumentRoot 書き換えにおけるワイルドカード

仮想ホストの 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

これは、「翻訳元" はドキュメントルート "/var/www/domains/sub.abc.net/httpdocs" を取得し、"翻訳元" はドキュメントルート "/var/www/domains/sub.xyz.org/httpdocs" を取得します。

しかし、*.abc.net へのリクエストは *.xyz.org ドキュメントルートに書き換えられる必要があります。

答え1

すべての.orgドメインを.netドメインdocumentrootにリダイレクトする必要があります

「書き直す」という意味だと思いますが、外部「リダイレクト」、あなたの質問のコードのように?(質問に記載されているように、必要な書き換えの方向も逆にしていますが、とにかく、コメントで述べたように... .org`.net に進みます)

これは、コード内で参照されている単一レベルの TLD (例: 、、、など) のみがあり、 などの複数レベルの「TLD」がないことを前提とし.netています。.me.info.org.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のみ。これらをそれぞれ との2 つの環境変数に保存しますTLD

次にTLDenv var をテストし、必要に応じてこれを変更します (つまり、orgに変更しますnet)。

そして最後に、コードにあるように、適切なドキュメント ルートとサブディレクトリ (上記で割り当てられた env 変数を使用) への無条件の書き換えがあります。説明では「ドキュメント ルート」とだけ述べていますが、コードには同じ名前のサブディレクトリも含まれているため、サブディレクトリも含めました。

これは、質問に記載されている mod_rewrite ディレクティブが完了していることを前提としています。つまり、構成のさらに下には他の依存ディレクティブはありませんか?L念のためフラグを追加しました。

関連情報