6

基本的に IIS で .htaccess を有効にするHelicon の ISAPI Rewrite 3を使用しています。www 以外の URL を www バージョンにリダイレクトする必要があります。つまり、example.com は www.example.com にリダイレクトする必要があります。例から次のルールを使用しましたが、サブドメインに影響します。

RewriteCond %{HTTPS} (on)?
RewriteCond %{HTTP:Host} ^(?!www\.)(.+)$ [NC]
RewriteCond %{REQUEST_URI} (.+)
RewriteRule .? http(?%1s)://www.%2%3 [R=301,L]

これはほとんどの場合機能しますが、sub.example.com を www.sub.example.com にリダイレクトします。サブドメインがリダイレクトされないように上記のルールを書き直すにはどうすればよいですか?

4

7 に答える 7

3

次の RewriteCond を追加します。

RewriteCond %{HTTP:Host} ^[^.]+\.[a-z]{2,5}$ [NC]

そうすれば、ご覧のとおり nondottedsomething.uptofiveletters にのみルールが適用されます。subdomain.domain.com は条件に一致しないため、書き換えられません。

[az]{2,5} を変更して、より厳密な tld 一致正規表現に変更したり、ドメイン名に許可された文字のすべての制約を配置したりできます ([^.]+ は厳密に必要なよりも寛容であるため)。

全体として、この場合は必要ないと思います。

編集: sadie は正規表現の欠陥を発見し、最初の部分を [^.] から [^.]+ に変更しました。

于 2008-09-08T23:28:15.617 に答える
1

@Vinko

一般的なアプローチとして、正規表現でTLDの長さを制限することを選択した理由がわかりません。これは将来を見据えたものではなく、どのようなメリットがあるのか​​わかりません。一致しない6文字のTLD(.museum)が少なくとも1つあるため、実際には「現在の証拠」ではありません。

これを行う必要はないようです。できませんでした^[^.]+\.[^.]\+$か?(注:疑問符は文の一部であり、正規表現ではありません!)

それはさておき、このアプローチにはさらに大きな問題があります。それは、TLDの真下にないドメインでは失敗するということです。これは、オーストラリア、英国、日本、および.co.jp、.co.uk、.com.auなどの階層を持つ他の多くの国のドメインです。

それがOPにとって懸念事項であるかどうかはわかりませんが、「すべて修正」の回答を求めている場合は注意が必要です。

OPは、一般的なソリューションが必要なのか、既知のドメインの単一(または小グループ)向けのソリューションが必要なのかをまだ明確にしていません。後者の場合は、ジグドンのアプローチの使用に関する他のメモを参照してください。前者の場合は、この投稿の情報を考慮して、Vinkoのアプローチを続行してください。

編集:私がこれまで省略してきたことの1つは、ビジネス面での選択肢である場合とそうでない場合がありますが、反対の方向に進むことです。すべてのサイトはhttp://www.domain.comhttp://domain.comにリダイレクトします。http://no-www.orgの人々は、これが「正しい」方法であるというかなり良いケース(IMHO)を作成していますが、それでも確かに好みの問題です。1つ確かなことは、この種のリダイレクトの一般的なルールを作成する方が、これよりもはるかに簡単なことです。

于 2008-09-09T18:46:31.573 に答える
1

@org 0100h はい、問題の説明から除外された多くの変数があり、すべてのポイントは有効なものであり、実際の実装の際に対処する必要があります。提案された正規表現には長所と短所の両方があります。一方で、それはより簡単で将来性のあるものですが、他方では、Host ヘッダーで送信された場合、example.foobar を本当に一致させたいですか? 間違ったドメインにリダイレクトしてしまう特殊なケースがいくつかあるかもしれません。3番目の代替手段は、正規表現を変更して、実際のドメインのリストを使用することです。

RewriteCond %{HTTP:Host} (example.com|example.net|example.org) [NC]

(Chris へのメモ、%1が変更されることに注意してください)

@chrisofspadesそれを置き換えることを意図したものではありません。条件2により、wwwがないことが保証されますが、私の場合はありません。一致を保存しないため、%1、%2、%3 の値は変更されません (つまり、括弧は使用されません)。

于 2008-09-09T21:14:02.747 に答える
1

次のようなurlrewriter.netを使用して、より詳細に制御できるようになりました。

<unless header="Host" match="^www\.">
   <if url="^(https?://)[^/]*(.*)$">
     <redirect to="$1www.domain.tld$2"/>
   </if>
   <redirect url="^(.*)$" to="http://www.domain.tld$1"/>
</unless>
于 2008-09-09T00:52:41.373 に答える
1

Zigdon の考えは正しいですが、彼の正規表現は正しくありません。使用する

^example\.com$

彼の提案の代わりに:

^example\.com(.*)

そうしないと、example.com と一致するだけでなく、example.comcast.net、example.com.au などと一致することになります。

于 2008-09-09T01:34:01.617 に答える
0

RewriteCond を example.com でのみ動作するように調整できませんか?

RewriteCond %{HTTP:Host} ^example\.com(.*) [NC]
于 2008-09-08T23:18:18.837 に答える
0

(httpdの)vhostファイルにこのようなものを入れてみませんか?

ServerName: www.example.com
ServerAlias: example.com

もちろん、それはリダイレクトされず、通常どおり続行されます

于 2008-09-09T01:23:08.757 に答える