web-dev-qa-db-ja.com

Apache 2.4 / php5.6-fpm / proxy_fcgiにPATH_INFOがありません

私は、リポジトリdeb.sury.orgのPHP-FPM 7.0.26-25.6.32-1でDebian9を使用しています。同じ構成が、PHP-FPM 5.6.30を使用するDebian8サーバーで正常に機能しています。

  • そのサーバーからpool.d/user.confをコピーしました。
  • 両方のphp.iniファイルにcgi.fix_pathinfo=1があります。
  • パラメータもphp_admin_value[cgi.fix_pathinfo] = 1を使用して強制されます。
  • 両方のサーバーは、<VirtualHost>コンテキストから次のようにこのプールを同様に使用します。

    ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/user.sock|fcgi://localhost/home/user/public_html
    

さて、PATH_INFO(おそらくPATH_TRANSLATED)からパスを読み取る必要があるAJAXページがあります。ただし、これらの変数はDebian8サーバー上で正しい内容を持っていますが:

["SCRIPT_NAME"]=>
string(14) "/path/ajax.php"
["ORIG_SCRIPT_NAME"]=>
string(25) "/path/ajax.php/para/meters"
["PATH_INFO"]=>
string(12) "/para/meters"
["PATH_TRANSLATED"]=>
string(34) "/home/user/public_html/para/meters"

新しいDebian9 + dub.sury.orgでは動作が異なるようです。

["SCRIPT_NAME"]=>
string(25) "/path/ajax.php/para/meters"
["PATH_TRANSLATED"]=>
string(22) "/home/user/public_html"

そして、プラメータORIG_SCRIPT_NAMEPATH_INFOは完全に欠落しています。

1
Esa Jokinen

それは私がproxy_fcgiを使用した方法でした。 mod_proxy_fcgi の例で説明されているように:

適切なハンドラーパススルーを作成することにより、リクエストをリバースプロキシリクエストとして処理するように強制することもできます。 ---この形式の利点は、サーバーでURIからファイル名への法線マッピングを実行できることと、ローカルファイルシステムの結果がバックエンドに渡されることです。 FastCGIがこのように構成されている場合、サーバーは最も正確なPATH_INFOを計算できます。

だから私は

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/user.sock|fcgi://localhost/home/user/...

ハンドラーとワーカーの場合:

    <FilesMatch "\.php$">
            SetHandler  "proxy:unix:/run/php/user.sock|fcgi://localhost"
    </FilesMatch>
    <Proxy "fcgi://localhost/" enablereuse=on max=10>
    </Proxy>

これで、すべてのAJAXリクエストが正常に機能しています。

ボーナス:Debian 8/Apache2.4で以前にProxyPassMatchPATH_INFOを計算できた理由を知っている人がいる場合.10/PHP-FPM 5.6.30ですが、Debian9ではそうではありません。

2
Esa Jokinen

それが説明されているように:

https://httpd.Apache.org/docs/2.4/mod/mod_proxy_fcgi.html#env

ProxyPassMatchがPATH_INFOを設定しない理由は、次のとおりです。

環境変数

Mod_proxyの動作を制御する構成ディレクティブに加えて、FCGIプロトコルプロバイダーを制御する環境変数がいくつかあります。

  • proxy-fcgi-pathinfo:ProxyPassまたはProxyPassMatchを介して構成されている場合、mod_proxy_fcgiはPATH_INFO環境変数を設定しません。これにより、バックエンドFCGIサーバーはSCRIPT_NAMEとScript-URIを正しく判別し、RFC3875セクション3.3に準拠することができます。代わりに、PATH_INFOの「最良の推測」を生成するためにmod_proxy_fcgiが必要な場合は、このenv-varを設定します。これは、一部のFCGI実装のバグの回避策です。この変数は複数の値に設定して、最良の推測がどのように選択されるかを微調整できます(2.4.11以降のみ)。

    • first-dot:PATH_INFOは、最初の「。」に続くスラッシュから分割されます。 URLで。

    • last-dot:PATH_INFOは、最後の「。」に続くスラッシュから分割されます。 URLで。

    • full:PATH_INFOは、URLをローカルファイルシステムにマップしようとすることによって計算されます。

    • unescape:PATH_INFOは、エスケープされていない/デコードされたURLのパスコンポーネントです。

    • その他の値:PATH_INFOは、URLのパスコンポーネントと同じです。もともと、これは唯一のproxy-fcgi-pathinfoオプションでした。

1
klor