3

Tuckey UrlRewrite を使用して URL ルールを設定しています。これまでのところすべてが機能していますが、デフォルトのページに苦労しています。

目的: - 既存のファイルと一致しない要求。または - 以前のルールに一致しないリクエストは ... を通じて検索を開始する必要がありますsearch.jsf?q=。これは、従来の Web サイトからのデッド リンクの可能性を処理し、404 ページをより機能的なものに置き換えることを目的としています (ユーザーが実際に探しているものを見つけやすくするため)。

部分的なコード (他のルールは 2 番目のものと似ていますが、「デフォルト」ルールのみがクラッシュします):

<rule>
  <name>Home</name>
  <from>^/$</from>
  <to type="forward" last="true">/home.jsf</to>
</rule>

<rule>
  <name>Contact Us</name>
  <from>^/contact_us/?$</from>
  <to type="forward" last="true">/contactUs.jsf</to>
</rule>

<rule>
  <name>Default + 404</name>
  <from>^/[^\s]+$</from>
  <to type="forward">^/search.jsf?q=$1</to>
</rule>

一致する物理ファイルがあってもに一致search.jsfするため、スタック オーバーフローが発生します。[^\s]+search.jsf

他のすべてのルールはlast="true"、重複するべきではありません (明らかに、このキャッチオールを除く)。

私はUrlRewriteFilter マニュアルを読みましたlast="true"が、理論的には、プロセスが他の一致を既に見つけた場合、他の一致をチェックするのを止める必要があるもの以外は何も見つかりませんでした。

どうもありがとうございました!

編集:答えがなく、この問題を解決できないため、別の方法を確認しました。こちらの質問を参照してください。

4

1 に答える 1

1

私は tuckey について何も知りませんが、2 つの簡単な解決策を思いつくことができます。

1次のよう/search?q=fooにURL を書き換える検索のルールを作成します。/search.jspf?q=foo

私は次のようなものを推測しています:

<rule>
  <name>Search</name>
  <from>^/search\?(.*)$</from>
  <to type="forward" last="true">/search.jsf?\1</to>
</rule>

/search次に、実際のファイルの代わりに使用するデフォルト ルールを変更します/search.jspf

<rule>
  <name>Default + 404</name>
  <from>^/[^\s]+$</from>
  <to type="forward">^/search?q=$1</to>
</rule>

2デフォルト ルールの一致する正規表現を書き換えてsearch.jspf、否定先読みを使用して明確に除外します。

<rule>
  <name>Default + 404</name>
  <from>^/(?!search.jspf)[^\s]+$</from>
  <to type="forward">^/search.jspf?q=$1</to>
</rule>
于 2013-08-17T15:30:56.803 に答える