1

私はここで答えを何時間も探していたと約束しますが、それでも機能していません。これが私が持っているものです:

RewriteCond %{HTTP_HOST} ^([^\.]*)\.example\.com [NC]
RewriteCond %{REQUEST_URI} !^/%1/ [NC]
RewriteRule ^(.*)$ /%1/$1 [L]

2行目が正しく一致していないため、これにより無限ループが作成されます。%1ただし、 2行目でに置き換えてwwwに移動するとwww.example.com、正常に動作します。明らかに、他のサブドメインでは機能しなくなりましたが、の値がであることがわかっているので、処理wwwせずに2行目に明示的に入力した%1場合は奇妙%1ですwww

私が達成しようとしていることは次のとおりです。私はドメイン「example.com」を持っています。ルートディレクトリには、「dev」、「test」、「www」など、いくつかのサブディレクトリがあります。htaccessファイルの上位に、サブドメインが空(example.com)、w(w.example.com)、またはww(ww.example)の場合に、ドメインを「www.example.com」にリダイレクトするように強制するルールがあります。 .com)、それ以外はそのままにしておきます(dev.example.com、test.example.com)。これで、ファイルのこの部分は、サブドメインに基づいてリクエストを正しいサブディレクトリに書き換えることになっています。したがって、「dev.example.com/something.jpg」のようなリクエストは「dev.example.com/dev/something.jpg」に書き換えられます(リダイレクトされません)。

ここでの計画は、ホームサーバー上に環境を再作成することなく、サーバー上に開発環境とテスト環境を作成できるようにすることです。すべてのサーバー設定が完全​​に同じであることを確認してください。また、私が望んでいたことは何でもできると思いますが、それは当面の必要性です。

4

1 に答える 1

1

問題は、の一致式で後方参照変数を使用できないことですRewriteCond。これで結構です:

# ----------V
RewriteCond %1 <regex>

しかし、これはそうではありません:

# -------------------------V
RewriteCond %{REQUEST_URI} %1

このような一致を行う必要がある場合に実行できることは、一致の後方参照を使用\1して、同じ正規表現内から一致にアクセスすることです。次に%1、の同じ左側のパラメータに後方参照を配置し、それと照合するためにRewriteCond使用できます\1。このようなもの:

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

したがって、%{REQUEST_URI}:%1ビットは次のようになります。式は":"(= "foo")の後にfooを探しているため、一致しません/foo:subdomain。したがって、ルールが適用され、URIはになり、2回目はになります。今回は、 = "subdomain"であるため正規表現が一致し、ルールが適用されないようにします。^/([^/]+)[^:]*:\1\1/subdomain/foo%{REQUEST_URI}:%1/subdomain/foo:subdomain\1!

于 2012-07-16T16:22:18.553 に答える