1

説明なしで私の質問を読みたい場合は、下の大きな太字のヘッダーにスキップしてください。

皆さん、どうぞ。まず、私が持っているコード:

AddType text/x-server-parsed-html .html .htm

RewriteEngine On
RewriteBase /

# checking to see if it's a secure request, then set environment var "secure" to either       "s" or ""
#
RewriteCond %{SERVER_PORT}s ^(443(s)|[0-9]+s)$ [NC]
RewriteRule ^(.+)$ - [env=secure:%2] [NC]



# Gets the value of the subdomain and puts it into environment variable "sub"
#
RewriteCond %{HTTP_HOST} ^([^\.]*)(\.)?example.com [NC]
RewriteRule ^(.*)$ - [env=sub:%1] [NC]



# Determines if the sub domain is blank, w, or ww, then redirects w/301 to www...
#
RewriteCond %{ENV:sub} ^(w|ww|)$
RewriteRule ^(.*)$ http%{ENV:secure}://www.example.com/$1 [R=301,L]



# Gets the highest sub domain and adds it as a top subdirectory to each request
#
RewriteCond %{REQUEST_URI}:example/%{ENV:sub} !^/([^/]+)[^:]*:\1 [NC]
RewriteRule ^(.*)$ /example/%{ENV:sub}/$1 [L]


#ErrorDocument 404 /pagenotfound
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1&%{QUERY_STRING} [PT]

したがって、ドメインを明示的に設定する必要があることを除いて、すべてが希望どおりに機能します。それを取得するための正規表現を理解できないため、異なるドメインでも同じように機能します。仕組みは次のとおりです。

最初にリクエストが安全かどうかを判断し、後で使用できるように保存します。

次に、www.example.comへのサブドメインとして「w」、「ww」、または「」のいずれかを持つexample.comへのリクエストに対して301リダイレクトを実行します。これにより、サイトへのすべてのリクエストでwww.exampleを使用するように強制されます。 com、「test」や「dev」などの設定されているものなど、(w | ww | www)以外のサブドメインを指定している場合を除きます。

次に、サブドメインの値を取得し(「dev.example.com」などをリクエストしたか、「www.example.com」にリダイレクトされたため、常に存在します)、書き換えます(リクエストを2レベル下のサブディレクトリにリダイレクトします。これが設定されているので、これはルートの「example」の下にある「www」ディレクトリになります。

最後に、URIを(リダイレクトではなく)きれいに書き換えます。問題はありません。私が好きなように機能しています。

ディレクトリ構造は次のとおりです。ルートには、ここでホストされているすべてのサイト(たとえば、anothersite、thirdsite)のディレクトリがあります。このhtaccessファイルの目的では、これらはすべて完全に無関係です。各ディレクトリ内には、「www」と「dev」の少なくとも2つのディレクトリがあります。本番サイトのファイルは「www」にあり、開発ファイルは「dev」にあります。テスト環境用の「test」のディレクトリをここに置くこともできます。または、他に必要なものは何でも、これが私が設定している方法です。

だから、私が欲しいのは次のようなものです:

Rewritecond %{HTTP_HOST} ^(match sub domain).(match domain).(match TLD) [NC]
RewriteRule ^(.*)$ -[env=sub:%1,env=domain:%2,env=tld:%3] [NC]

この2行目は正しく機能することを私は知っています、それは私が理解できない1行目の正規表現にすぎません。サブドメインが指定されている場合とされていない場合があり、ドメインの前にピリオドがある場合とない場合があることに注意してください。

これにより、次のように23行目を書き直すことができるようにすることで、スクリプト全体でルートディレクトリでホストされているサイトを処理できるようになります。

RewriteRule ^(.*)$ http%{ENV:secure}://www.%{ENV:domain}.%{ENV:tld}/$1 [R=301,L]

そして29行目は次のようになります。

RewriteCond %{REQUEST_URI}:%{ENV:domain}/%{ENV:sub} !^/([^/]+)[^:]*:\1 [NC]

ですから、私は自分が何を持っているのか、何をしようとしているのか、そして何を達成したいのかを非常に明確に説明したと思います。誰かが15行目の正規表現を手伝ってもらえますか?

4

1 に答える 1

0

この2行目は正しく機能することを私は知っています、それは私が理解できない1行目の正規表現にすぎません。サブドメインが指定されている場合とされていない場合があり、ドメインの前にピリオドがある場合とない場合があることに注意してください。

正規表現は次のようになります。

Rewritecond %{HTTP_HOST} ^(([^\.]+)\.)?([^\.]+)\.([^\.]+)$ [NC]
RewriteRule ^(.*)$ - [env=sub:%2,env=domain:%3,env=tld:%4]

これにより、ルールラインも変更されます(「-」の後にスペースがありません)。これ%1は、ドットも逆参照するためです。

于 2012-07-18T16:08:17.080 に答える