2011-01-14 22 views
2

私のApache構成では、mod_rewriteを使用して外部アプリケーション(RewriteMap prgを使用)を呼び出してURLを書き換えます。それはうまく動作します。私が扱う必要があるのは、リクエストURLが私たちが探しているURLと特に一致しない境界条件です。また、外部アプリケーションからエラーが返された場合は、エラーページにリダイレクトする必要があります。ここでmod_rewrite RewriteRule if-then-else trouble

はコードです:

我々は古いASPスクリプト(SomeScript.asp)の要求を取得すると、Javaアプリケーションは、正しいURLをルックアップするために呼び出されます。正しいURLまたは "/ error"を返します。 "/ error"が返された場合、RewriteRuleはそれをエラーページに変更します。したがって、ルール1とルール2は結びついています。ルール1を実行する場合、ルール2を実行する必要があります。ルール1とルール2が一致する場合、ルール3は実行されません。ルール3は、403-禁止されたエラーを返すすべてのルールをキャッチします。

上記のコードは近いですが、それほどありません。キャッチオールファイナルルールはあまりにも多くをキャッチしています。ルール1が一致すれば、ルール3もそれをキャッチして403を返します。

ルール1と2が上記のように動作するようにするにはどうすればよいですか?一致しない場合、403エラーが返されますか?

おかげ

答えて

1

は、ここで我々がやってしまったものです:私たちは、第二のラインを処分しましたエラーファイルのURLを返すようにJavaアプリケーションを変更しました。最初の行に一致しなかったものは、最終的なキャッチオール行にキャッチされ、Forbiddenメッセージで応答します。おそらくmod_rewriteロジックではできないことがあります。

RewriteMap forwardURL "prg:\"C:/Program Files/Java/jdk1.6.0_11/bin/java.exe\" -jar \"C:/app/Mapper.jar\"" 

RewriteLock bin\map.sub.lock 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^/SomeScript.asp(.*)$ ${forwardURL:%{QUERY_STRING}} [L] 
RewriteRule ^(.*)$ - [F] 

そして、我々は、単一のJavaアプリが書き換え質問に答えることのボトルネックがあまりにもだった、とTomcatの下で実行されているサーブレットにそれを変換することを決めました。このようにパフォーマンスが向上し、レスポンスヘッダーも完全に制御できるようになりました。試してみた

1

[L]フラグを使用して、このフラグは意味一致した場合には書き換え処理を停止します。したがって、 の第1のタグと の第2のタグのこのタグを追加してください。

編集 -

が速すぎ;:それは第二に連鎖しているように、あなたは、第一ルールに同様[C]タグを追加する必要があり、これは第二のルールの実行を作ります1回目の試合の場合。 RewriteMap命令について

マッチしない、ない「エラー」の場合「NULL」リターンを求めるApacheのマニュアルをPRG - 唯一の第二は、[L]

エンド編集を必要とします。

そして、あなたはスティル一部questionon MOD-書き換えを持っているとservfaultで、この優れもののApacheのmod - 書き換えドキュメントのチェックについて恐れている場合:everything-you-ever-wanted-to-know-about-mod-rewrite-rules-but-were-afraid-to-ask

+0

RewriteRule ^/SomeScript.asp(。*)$ $ {forwardURL:%{QUERY_STRING}} [C] RewriteRule ^/error(。*)$ /error.html [L] RewriteRule ^(。*)$ - [F] この結果、常に403が返されます。最後のケースは、最初のルールが成功すると常に一致します。私は戻り値に '/ error'を付けて、パラメータの問題があるかどうかを検出して、リクエストをエラーページに送ることができます。 – MonkeyWrench

+0

醜いフォーマットについてごめんね... – MonkeyWrench

+0

第1回がOKならあなたは2番目が一致しない場合にのみ3回目を得るでしょう。うまくいくはずです。あなたはApacheを再起動しましたか? RewriteLogおよびRewriteLogLevelディレクティブ – regilero