0

VirtualDocumentRootで設定した値を使用したいと思いますRewriteRule

Apacheのドキュメントには次のように書かれています:

もう 1 つ決定する必要があるのは、ドキュメント ルートです (DocumentRoot で構成され、DOCUMENT_ROOT 環境変数を介して CGI スクリプトで使用できます)。通常の構成では、これは URI をファイル名にマッピングするときにコア モジュールによって使用されますが、サーバーが動的仮想ホスティングを行うように構成されている場合、そのジョブは別のモジュール (mod_vhost_alias または mod_rewrite) によって引き継がれる必要があります。マッピングの方法。これらのモジュールはどちらも DOCUMENT_ROOT 環境変数の設定を担当していないため、CGI または SSI ドキュメントがそれを使用すると、誤解を招く値が取得されます。

ドキュメントを参照すると、 では使用できないよう%{DOCUMENT_ROOT}ですRewriteRule。しかし、別の解決策を探したところ、「2.4.1 で修正済み」というこのチケット(タイトル: DOCUMENT_ROOT 環境変数が VirtualDocumentRoot で正しく設定されていない) を見つけました。

Apache の最新 (安定) バージョンを使用しています。

$ httpd -v
Server version: Apache/2.4.9 (Unix)
Server built:   Jun 18 2014 03:07:48

...しかし、それは私にはうまくいかないようです。テスト時に%{DOCUMENT_ROOT}は、httpd.conf の DocumentRoot によって設定されたデフォルト値があります。%{DOCUMENT_ROOT}(または使用できる他の変数)を動的に設定したいと思いVirtualDocumentRootます。

httpd-vhosts.confで使用したいものは次のとおりです。

<VirtualHost *:8080>
    ServerName dev
    ServerAlias *.dev

    VirtualDocumentRoot "/usr/local/var/www/.dev/%-2+"

    RewriteRule ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/$1" [P]
</VirtualHost>

解決策はありますか?

4

1 に答える 1

0

@John Auld (お時間とご協力ありがとうございます)でさまざまな方向を調べた後、最終的に解決策を見つけました。以前のコメントで述べたように、100% 完璧ではありませんが、私にとっては十分です。

わかりやすくするために、httpd-vhosts.conf に入れたかったのは次のとおりです。

<VirtualHost *:8080>
    ServerName dev
    ServerAlias *.dev

    VirtualDocumentRoot "/usr/local/var/www/.dev/%-2+"

    RewriteRule ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/$1" [P]
</VirtualHost>

そして、ここに私が思いついたものがあります:

<VirtualHost *:8080>
    ServerName dev
    ServerAlias *.dev

    VirtualDocumentRoot "/usr/local/var/www/.dev/%-2/%-3"

    RewriteCond %{SERVER_NAME} (?:([^.]+)\.)?([^.]+)\.dev
    RewriteRule ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/usr/local/var/www/.dev/%2/${:%1|www}/$1" [P]
</VirtualHost>

RewriteCondの一部をキャプチャして%{SERVER_NAME}で再利用するために使用しますRewriteRule

%1サブドメイン ( ) とドメイン ( )の 2 つのキャプチャ グループがあります%2。サブドメインはオプションなので、構文を使用し${map:value|default}てサブドメインが空の場合のデフォルト値を設定します。

VirtualDocumentRoot%N.Mパーツ ( ) が使用できない場合、独自のデフォルト値があります。ドキュメントで述べたように:

N または M が使用可能なパーツの数よりも大きい場合、1 つのアンダースコアが補間されます。

そのため、オプションのサブドメインで機能させるために、ちょっとした「トリック」を使用する必要がありました。

ln -sfv /path/to/the/project/www /path/to/the/project/_

「構成のみ」を行う方法を考えている場合は、コメントを残してください。あなたの貢献で回答を編集します。

于 2014-06-23T12:34:46.697 に答える