18

仮想ドメイン システムに取り組んでいます。ワイルドカード DNS を として設定しており*.loc、自分の.htaccessファイルで作業しようとしています。次のコードが機能します。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www.)?example\.loc$ [NC]
RewriteCond %{REQUEST_URI} !^/example/
RewriteRule (.*) /example/$1 [L,QSA]

しかし、これを入力したもので動作させたいのです%{REQUEST_URI}が、ドメインとして見つかったテキストに対してチェックする必要があります。私はこのコードを使用してみました:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www.)?([a-zA-Z0-9-]*.)?([a-zA-Z0-9-]+)\.loc$ [NC]
RewriteCond %{REQUEST_URI} !^/%3/
RewriteRule (.*) /%3/$1 [L,QSA]

しかし、この行RewriteCond %{REQUEST_URI} !^/%3/により、コードで内部サーバー エラーがスローされます。これはコード内の %N が原因であることは理解していますが、それを処理する方法はありますか? この行が必要です。そうしないと、コードが内部リダイレクトで失敗します。

これが誰かにとって意味があることを願っています。必要なのは、次の RewriteCond で RewriteCond を後方参照できることだけです。

4

1 に答える 1

47

ここで間違っていることが2つあります。

まず、あなたの%{HTTP_HOST}正規表現は良くありません。ドットをエスケープする必要があり.ます。そうしないと、「改行ではない任意の文字」として扱われます。これにより、基本的に%3逆参照は TLD の前のホスト名の最後の文字になります (例: http://blah.bar.loc% 3 = r)。

第二に、 a の正規表現で後方参照を使用することはできませんRewriteCond。左側の文字列のみです。これは一種の奇妙な制限です。ただし、正規表現で参照を使用して、\1照合する巧妙な左側の文字列を作成できます。のようなもので、次のよう%3::%{REQUEST_URI}に一致させることができます: !^(.*?)::/\1/?. この正規表現は基本的に、「 :: の前の最初のテキスト ブロックを照合してグループ化し、 ::続くテキストブロックが"で始まることを確認してください。/(first block)

したがって、ルールは次のようになります。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?([a-zA-Z0-9-]*\.)?([a-zA-Z0-9-]+)\.loc$ [NC]
RewriteCond %3::%{REQUEST_URI} !^(.*?)::/\1/?
RewriteRule (.*) /%3/$1 [L,QSA]
于 2013-04-12T21:21:57.160 に答える