2017-06-06 7 views
0

Symfonyへのリクエストに対してIIS7でリバースプロキシリライトルールを設定しました。 これはパターンにマッチし、正確なリクエストの詳細を渡していますが、技術的な観点からは正しく動作していますが、Symfonyは正しい情報を使用していないようです。 (書き換えルールに パターンにマッチしたものをSymfonyのリクエストコンテキストで、IIS書き換えルールからREQUEST_URIを使用するにはどうすればよいですか?

  • HTTP_X_ORIGINAL_URL="/foo/bar/foo/someCall/123456789"
  • REQUEST_URI="/bar/foo/someCall/123456789":symfonyが$_SERVERで他のサーバから受信したかを確認するにはapp.php

    ブレークポイントは、このために、関連するパラメータは、詳細)

/bar/foo/someCall/{id}の経路が設定されていますが、要求コンテキストではpathInfoとして/foo/bar/foo/someCall/{id}と表示され、「No route exists ...」というエラーが発生します。

REQUEST_URIにあるものを使用するには、リクエストコンテキスト(経路リスナーなど)が必要です。もし可能であれば、そうすることができるでしょうか?

答えて

0

IISは、書き換えの一部としてヘッダHTTP_X_ORIGINAL_URLを生成し、残念ながらsymfonyはprepareRequestUri()目的球にif ($this->headers->has('X_ORIGINAL_URL'))ために起因する状態にREQUEST_URIを上書きします。

ピエールが彼の答えで語ったことから始まって、彼は問題を回避する方法を考え出すのを手伝った。

HTTP_X_ORIGINAL_URLを空にするには、nginx confファイルを '上書き'して、条件が満たされず、REQUEST_URIが間違って上書きされないようにしなければなりませんでした。

location ~^\/{url}\/? { 
    ... 
    proxy_set_header X-ORIGINAL-URL ""; 
    ... 
} 
1

リバースプロキシを使用する場合は、プロキシURLと一致するようにアプリケーションを変更しないでください(プロキシの背後で実行されていることにも注意してください)。代わりに、プロキシはアプリケーションに正しい情報を確実に送信する必要があります。そのためには、Syfonyがルートが一致するかどうかをどのように判断するのかを理解する必要があります。

SymfonyはデフォルトでREQUEST_URIを使用して経路を決定します。しかし、IIS書き換えルールもサポートしており、REQUEST_URIの値は上書きされます。これはhttps://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/HttpFoundation/Request.php#L1684-L1717です。したがって、REQUEST_URIでの作業はここでは機能しません。

この場合、興味深い部分は、SymfonyがベースURL(https://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/HttpFoundation/Request.php#L1729-L1752)を決定する方法です。 URLのベースを書き直そうとしているので、プロキシの一部として渡されるスクリプトパスを操作するのが最善の方法です。私はIISの専門家ではなく、書き換えルールの仕組みもありませんが、Nginxをリバースプロキシとして使用する場合は、通常はX-SCRIPT-NAMEヘッダーをベースパスに設定してIISで同様のことを試すことができます。

+0

Symfonyがどのように要求と書き換えを処理するかについての説明と追加情報については、非常にありがとうございます。 :) – ddtpoison777

関連する問題