2016-11-15 12 views
4

私が必要とするものを説明しようとしましょう。RubyとPumaを使用して他のリクエストによって生成されたリクエストを検出するにはどうすればよいですか?

ブートストラップのようなライブラリをHTMLページに挿入してこのページを読み込むと、ライブラリのメインファイルも読み込まれます。ほとんどの場合、ライブラリファイルには他のファイルが必要です。 Bootstrapを例として使用したので、glyphicons-halflings-regular.svgglyphicons-halflings-regular.ttfglyphicons-halflings-regular.woff、およびglyphicons-halflings-regular.woff2をすべてBootstrapの一部として考えてみましょう。

私はアプリケーションからのリクエストに対処するためにラックミドルウェアを書いています。このミドルウェアのタスクの1つは、特定の規則に従って要求を変更することです。例えば、自分のアプリケーションにブートストラップは、このパス

ENV['HOME']/my_app/web/libraries/bootstrap/ 

に位置するであろうし、その主なCSSファイルは、

ENV['HOME']/my_app/web/libraries/bootstrap/css/bootstrap.css 

だろうそしてロードされたとき、それはすべてのこれらのファイルの新しい要求を生成するI上記の通り。

私が必要とするのは、特定のファイル(例:glyphicons-halflings-regular.svg)が別のファイルで必要とされていることです。そのため、私のRackミドルウェアを使用してその場所を変更することがあります。 Like:

Requested file: 
    `glyphicons-halflings-regular.svg` 
Requested-by: 
    http://my_app_domain.com/web/libraries/bootstrap/css/bootstrap.css 
Request address: 
    http://my_domain_app.com/web/libraries/bootstrap/css/../fonts/glyphicons-halflings-regular.svg 

私は新しいリクエストごとにスレッドを開始しようとしていますが、次に、メインファイルのアドレスをベースアドレスとみなして、そのファイルによって生成されたすべてのサブリクエストにそのアドレスを付加します。

私はこれについてあなたの考えを聞きたいです。同じことをするためのより良い方法の提案?

EDIT:(spickermannの質問)

いいえ、これはポイントではありません。たぶん私ははっきりしていなかったかもしれません。

は、次のような構造を考えてみましょう:

ENV['HOME']/my_app/web/libraries/library1/ 
           |  | 
           |  |_ a_css_file.css 
           |  |_ a_jpeg_file.jpg 
           | 
           /library2/ 
             | 
             |_ another_css_file.css 
             |_ a_jpeg_file.jpg 

はのは、私のミドルウェアがa_jpeg_file.jpgという名前のファイルに対する要求を受信すると仮定しましょう。同じ名前の2つのファイルがあります.1つはlibrary1、もう1つはlibrary2です。

a_jpeg_file.jpgが必要な場合は、a_css_file.cssまたはanother_css_file.cssのいずれかのファイルを判断する唯一の方法です。

最初のケースでは、library1へのパスをファイルに追加して、ENV['HOME']/my_app/web/libraries/library1/を提供します。それ以外の場合は、パスをlibrary2の前に置き、ENV['HOME']/my_app/web/libraries/library2/とします。

どちらのファイルでも、どのファイルがa_jpeg_file.jpgのリクエストを生成したのかを知る必要があります。

つまり、特定のファイルが必要なライブラリコンテキストを知る必要があります。

+2

また、あなたの 'view_folders'配列に" my_app/web/libraries/bootstrap/css "を追加することもできます。次に、ファイルが要求されると、各ビューフォルダを歩き、そこにこのファイルがあるかどうかを確認します。存在する場合は、検索を停止して配信します。 –

+2

しかしまず、REFERER httpヘッダーをチェックしてください。それはあなたが必要とするものを含んでいるかもしれませんが(私はそれがページのURLを含んでいます) –

+0

さて、@ SergioTulentsev。しかし、ブートストラップはほんの一例であった。私のミドルウェアは、私が私のアプリで使っているライブラリにこれを行うことができなければなりません。 –

答えて

3

あなたのリソースをパラメータ化してlike my-image.jpg?dir='dir1'とし、ミドルウェアのparamsを解析できますか?同様のアプローチが、Railsによってアセットをキャッシュするために行われます。また、image.jpt?info=HughYF65fFj7t...のように、パラメータの情報を暗号化および復号化するいくつかの暗号化機能を使用して、ミドルウェアの情報を復号化し、送信した情報を使用することができます。