2

次の問題を考えてください。次のような階層的なサブドメインを持つ domain.tld を取得しました。

a.domain.tld
b.a.domain.tld
c.b.a.domain.tld
... etc.

Web ルートには、仮想のディレクトリ構造もあります。

/foo
/a.
/a./b.
/a./b./bar
/a./b./c.
... etc.

以下に示すような方法で Apache がディレクトリを提供するような書き換えを実現したいと考えています。

a.domain.tld      -->  /a.
b.a.domain.tld    -->  /a./b.
c.b.a.domain.tld  -->  /a./b./c.
... etc.

末尾にドット文字がないディレクトリは、通常のサブディレクトリとして動作します。

domain.tld/foo/    --> /foo
a.b.domain.tld/bar --> /a./b./bar

私は mod_vhost_alias を使用できません。mod_rewrite のみを使用して解決策を達成できれば幸いです。そのような書き換えを達成することは可能ですか?

アドバイスありがとうございます。

--
nkd

4

3 に答える 3

1

サブドメインの 4 つのレベルの可能な解決策:

RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.tld
RewriteRule (.*) %1./$1 [R,L]

RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.domain\.tld
RewriteRule (.*) %2./%1./$1 [R,L]

RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.([^\.]+)\.domain\.tld
RewriteRule (.*) %3./%2./%1./$1 [R,L]

RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.([^\.]+)\.([^\.]+)\.domain\.tld
RewriteRule (.*) %4./%3./%2./%1./$1 [R,L]

ありがとうございました。

--
nkd

于 2010-02-12T02:03:31.460 に答える
1

前のソリューションは、非常に面白い無限のリダイレクト ループで終わります。これが私が今得た解決策です(あまりエレガントではありませんが、機能しますが、巨大な「しかし」があります):

# Working solution for five levels of sub-domains

RewriteEngine on

RewriteCond %{HTTP_HOST} ^([^\.]+)\.DOMAIN\.TLD [NC,OR]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.DOMAIN\.TLD [NC,OR]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.([^\.]+)\.DOMAIN\.TLD [NC,OR]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.([^\.]+)\.([^\.]+)\.DOMAIN\.TLD [NC,OR]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.([^\.]+)\.([^\.]+)\.([^\.]+)\.DOMAIN\.TLD [NC]

RewriteRule (.*) http://DOMAIN.TLD/%5./%4./%3./%2./%1./$1 [R,L]

なぜ(地獄に)それが機能するのか誰か説明してもらえますか?それは本当にうまくいきます、私はそれを広範囲にテストしました。しかし、なぜそれが実際に機能するのですか?RewriteRule 行を見ると、うまくいくとは思えません...説明ありがとうございます。

ところで: 上記の 5 つの書き換え条件とルールが機能する場合、ある種の「2 行」 (1 つの条件と 1 つのルール) で書き換えることができるように見えます。上記の5つの条件の代わりに、上記のルールと次の条件を使用して、すでにそれを試しました。

RewriteCond %{HTTP_HOST} ^(([^\.]+)\.)+DOMAIN\.TLD [NC]

少し遊んでみましたが、実際の成功はありませんでした。書き換えを簡素化し、より「正気」にする方法についてのすべてのアイデアに感謝します(可能であれば)。

--
nkd

于 2010-02-17T22:40:45.650 に答える
0

反転させる部分を経由で外部スクリプトに送ってRewriteMap処理してもらうと可能です。

于 2010-02-12T01:37:56.800 に答える