web-dev-qa-db-ja.com

Nginx + PHP-FPM URIエイリアスと複数のphpディレクトリ

同じドメインの2つの異なるディレクトリにある複数のPHPベースのアプリをホストするようにNginxを構成しようとしています。

http://webserver.local/ > /path/to/websiteから提供されるアプリ

http://webserver.local/app > /path/to/php-appから提供されるアプリ

これが私が持っている設定です。

  • http://webserver.local/ を押すと、すべてが機能します(PHPおよび非PHPリソース))。
  • ただし、PHPにアクセスするとスクリプトが機能しません http://webserver.local/app/index.phpFile Not Found(ただし、 、ファイルは/path/to/php-app/index.phpにあります)。
  • ファイル/path/to/php-app/test.txt(PHPではないもの)を作成し、- http://webserver.local/app/test.txt に移動すると、テキストファイルが期待どおりに表示されます。

誰かが私が間違っているところについていくつかの光を当てることができますか?ありがとう:)

server {
    listen       80;
    server_name  webserver.local;

    location / {
        root   /path/to/website;
        index  index.php;

        location ~ \.php$ {
            root           /path/to/website;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }

    location ^~ /app {
        alias   /path/to/php-app;
        index  index.php;

        location ~ \.php$ {
            root           /path/to/php-app;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}
3
cpjones44

ネストされたlocation ~ \.php$ブロックは、PHPスクリプトを検出しません。$document_root/path/to/php-appに設定されています。$fastcgi_script_name$uriと同じで、/appプレフィックスが含まれています。

正しいアプローチは、$request_filenameを使用して、偽のrootステートメントを削除することです。

location ^~ /app {
    alias   /path/to/php-app;
    index  index.php;

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $request_filename;
    }
}

インクルードファイルの内容によって暗黙的に上書きされないように、fastcgi_paramsステートメントの前には常にfastcgi_paramを含めてください。詳細は このドキュメント を参照してください。

4
Richard Smith