1

すべての着信リクエストを受信し、このリクエストが処理したいものであるかどうかを一連のルールに基づいて決定し、そうでない場合は、通常どおりリクエストを処理するapacheに制御を戻すapache mod_perlハンドラーを使用することは可能ですか?

ユースケース:

index.html(または同様のもの)を提供するためにDirectoryIndexを使用し、perlスクリプトなどにデフォルトのハンドラーを使用するレガシーサイトには、新しくなったurlスキーム(django / catalyst-ish)が与えられています。ディスパッチャーには、着信URLに基​​づいてディスパッチされるコントローラーにマップされた一連のURLがあります。

ただし、注意が必要なのは、このディスパッチャーを古いサイトと同じ仮想ホストの同じ名前空間内に配置することです。「すべて更新」の移行では、新しいシステムでサイトのパフォーマンスをテストする機会がなく、サイトのサイズが非常に大きいため実行できないため、サイトを1つずつ書き直すことを考えています。

多くの問題の1つは、ディスパッチャがすべてのURLを期待どおりに受信するようになりましたが、DirectoryIndexと静的コンテンツ(ほとんどが別のホストによって提供されますが、すべてではありません)が適切に提供されないことです。ディスパッチャは、一致しないURLに対してApache :: Const :: DECLINEDを返しますが、Apacheは通常どおりにリクエストを処理し続けず、代わりにデフォルトのエラーページを表示します。Apacheは/index.htmlなどを検索しようとしないようです。

これはどのように解決できますか?内部リダイレクトを使用する必要がありますか?ディスパッチャのハンドラスタックを変更しますか?いくつかの巧妙なディレクティブを使用しますか?上記のすべて?まったく不可能ですか?

すべての提案は大歓迎です!

4

2 に答える 2

1

私は似たようなことをしましたが、しばらく前に行ったので、少し曖昧かもしれません:

  • 標準のファイル ハンドラー (これは set-handler ディレクティブを使用して行われると思います) と、スタック内の perl ハンドラーが必要だと思います。
  • PerlTransHandlerまたは同様のものを使用して、ファイル名/URL マッピング フェーズにフックし、インラインの次のハンドラーがファイル システムから正しいファイルを取得するようにする必要がある場合があります。
于 2010-02-10T11:01:46.777 に答える
0

おそらく、要求されたファイルがファイルシステムに存在しない場合にのみ、ディスパッチャへのURLを書き換えるmod_rewrite構成を使用して成功するでしょう。このようにして、新しいアプリケーションは古いアプリケーションのオーバーレイとして機能し、新しいパーツの展開中にアプリケーションの古いパーツを削除するだけで、次のステップで置き換えることができます。

これは、RewriteCondとRewriteRuleの組み合わせによって実現できます。新しいアプリケーションは、古いアプリケーションで使用されていないプライベートな「名前空間」(場所)に配置する必要があります。

私はmod_perlの専門家ではありませんが、たとえばmod_phpを使用すると、次のように機能します。

RewriteEngine on

# do not rewrite requests into the new application(s) / namespaces
RewriteRule ^new_app/ - [L]

# do not rewrite requests to existing file system objects
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

# do the actual rewrite here
RewriteRule ^(.*)$ new_app/dispatcher.php/$1
于 2010-02-10T10:23:11.140 に答える