Nginx regex vhostパターンはPHPサーバー名になります


12

次のように、正規表現に一致するnginxサーバー定義があります:

server_name ~^(?<vhost>[a-z0-9-]+)\.example\.com$;
root /var/www/example/$vhost;
access_log /var/log/nginx/$vhost.example-access.log;

それはすべてうまくいきますが、このドメインはfastcgiとPHP-FPMを使用してさまざまなPHPプロジェクトをホストし、$_SERVER次のような値を受け取ります。

SERVER_NAME => "~^(?<vhost>[a-z0-9-]+)\.example\.com$"
HTTP_HOST   => "myhost.example.com"

ご覧のとおり、SERVER_NAME一致した文字列ではなく、正規表現パターンが挿入されます。それは私には少しバグが多いように見えますが、不必要な詳細が明らかになるというセキュリティ上のリスクも表します(他の構成では、ワイルドカードではなく特定の名前のセットに一致します)。

「SERVER_NAMEの代わりにHTTP_HOSTを使用する」と言うかもしれません-それが単純だった場合のみ-SERVER_NAMEが(驚くことではないが)サーバーの名前を含むことを期待するライブラリがあります。この振る舞いの良いユースケースは本当に見当たらない。

回答:


14

この質問を書くことのゴム製のアヒル効果のおかげで、私は解決策を見つけました。

Nginxのストックfastcgi_paramsファイルには次の行が含まれています。

fastcgi_param  SERVER_NAME        $server_name;

これにより、その値$_SERVER['SERVER_NAME']がPHP環境に表示されます。

$ host変数を使用するように変更しました:

fastcgi_param  SERVER_NAME        $host;

そして私の問題はなくなりました。このアプローチの欠点があるかどうかを知りたいです。


このアプローチの唯一の欠点は、$ host変数に依存していることです。つまり、ユーザーがHTTP_HOSTヘッダーを送信すると、ユーザーによって上書きされる可能性があります。curl:curl --header "HOST: google.com" http://yourdomain/yourpage.phpおよびyourpage.php put を使用してこれをテストできます:<?php echo $_SERVER['SERVER_NAME']; ?>google.com
Ghulam Ali

2
server_name  ~^(?<subdomain>.+)\.example\.com$;
set $server_name_full $subdomain.example.com;


location ~ \.php$ {
    ...
    include fastcgi_params;
    fastcgi_param SERVER_NAME $server_name_full;
    ...
}

3
コードは高く評価されていますが、必ず付随する説明が必要です。これは長くする必要はありませんが、予想されます。
peterh -復活モニカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.