1

存在しないファイルを古いサーバーにプロキシしながら、新しいサーバー上のファイルを提供するルールを作成しようとしています。プロキシ ルールは正常に機能し、不足しているファイルとディレクトリが古いサーバーに送信されます。

私が抱えている問題は、new-server.example.com/blah (/blah/ が新しいサーバーに存在する) がプロキシ ルールに渡され、古いサーバーにルーティングされることです。

スキップを試みる理由は、new-server.example.com/blah が「プロキシ セクション」に落ちて、new-server.example.com/blah/index.php を渡すためです。新しいサーバーには Index.php はありませんが、index.html はあります。「プロキシ セクション」は、DirectoryIndex 内のすべてのインデックス ファイルの可能性に従うわけではなく、最初のものだけを調べます。

そのため、「要求された URL /blah/index.php はこのサーバーで見つかりませんでした」というエラー メッセージが表示されます。

実際に機能するようにこれをどのように書くことができますか? - ありがとう。

RewriteEngine On
# skip, proxy section
RewriteCond /var/www/html%{REQUEST_FILENAME}     -f  [OR]
RewriteCond /var/www/html%{REQUEST_FILENAME}     -d
RewriteRule .? - [S=4]

# proxy section
RewriteCond /var/www/html%{REQUEST_FILENAME}       !-f
RewriteCond /var/www/html%{REQUEST_FILENAME}       !-d
RewriteRule ^/(.*) http://old-server.example.com/$1 [P]
ProxyPassReverse / http://old-server.example.com/


# rewrite log
pass through /index.php
init rewrite engine with requested uri /
applying pattern '.?' to uri '/'
RewriteCond: input='/var/www/html/' pattern='-f' => not-matched
RewriteCond: input='/var/www/html/' pattern='-d' => matched
pass through /
init rewrite engine with requested uri /index.php
applying pattern '.?' to uri '/index.php'
RewriteCond: input='/var/www/html/index.php' pattern='-f' => matched
pass through /index.php
init rewrite engine with requested uri /blah/
applying pattern '.?' to uri '/blah/'
RewriteCond: input='/var/www/html/blah/' pattern='-f' => not-matched
RewriteCond: input='/var/www/html/blah/' pattern='-d' => matched
pass through /blah/
init rewrite engine with requested uri /blah/index.php
applying pattern '.?' to uri '/blah/index.php'
RewriteCond: input='/var/www/html/blah/index.php' pattern='-f' =>    not-matched
RewriteCond: input='/var/www/html/blah/index.php' pattern='-d' => not-matched
applying pattern '^/(.*)' to uri '/blah/index.php'
RewriteCond: input='/var/www/html/blah/index.php' pattern='!-f' => matched
RewriteCond: input='/var/www/html/blah/index.php' pattern='!-d' => matched
rewrite '/blah/index.php' -> 'http://old-server.example.com/blah/index.php'
forcing proxy-throughput with http://old-server.example.com/blah/index.php
go-ahead with proxy request proxy:http://old-server.example.com/blah/index.php [OK]
4

1 に答える 1

0

これはバージョン 2.0 以降の Apache の動作方法です: リクエストを取得し、そのリクエストをすべての RewriteRules で実行し、結果のリクエストがディレクトリの場合、最初の DirectoryIndex が機能するかどうかを確認しようとします。 RewriteRules を呼び出して、結果を提供しようとします。最初の DirectoryIndex エントリが機能しない場合 (つまり、Apache が 404 を返すところまで到達した場合)、サーバーは次のエントリなどで再試行します。あなたの問題は、明らかに、プロキシ ルールが存在しない最初の DirectoryIndex 値に引っ掛かり、リバース プロキシ経由で送信しようとすることです。

この動作をサーバー全体で修正する一般的な方法は見つかりませんでしたが、回避策があります。ファイルまたはファイルの<Location>セクションを使用して、その場所をオーバーライドします。httpd.conf.htaccessDirectoryIndex

あなたの場合、ファイルを作成し/var/www/html/blah/.htaccess、次の内容を入れます。

DirectoryIndex index.html
于 2013-11-19T22:01:36.767 に答える