うまく動かないのはバーチャルホストであることが問題ではなく
エンドポイント alias の問題みたいで
最初の質問からききたいことが変わってきてるので1度整理し直しました


すでにかなり古いバージョンの apache + Fuel で動いてる API サーバーがあって
今回部品を全部新しくした上で nginx 上で動くようにしたいです

fuel が /srv/www/localhost/current/api にインストールされていて
apache では

 Alias /api "/srv/www/localhost/current/api/public"

という設定があって最終的に localhost/api/user/ というエンドポイントで
app/classes/controler/user.php コントローラーが呼ばれるようにしたいです

fuel, nginx, php-fpm のインストールや既存ソースのデプロイはおわって

https://fuelphp.com/docs/installation/instructions.html#/nginx
教えていただいた Fuel の nginx の設定をみて

server {
    listen       80;
    server_name  localhost;
    root         /srv/www/localhost/current/api/public;
    index        index.php index.html index.htm;

    location / {
        index index.php;
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param FUEL_ENV "<%= @env %>";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

のようにかいたところ curl localhost/user は user コントローラーを見に行ってくれました

ただ nginx で alias で PHP を動かす方法がわからずに困っています
どうすれば /api というプレフィックスのついたエンドポイントでアクセスできるでしょうか


① nginx にも alias というのがあるみたいなので単純に

    location   /api {
        alias  /srv/www/localhost/current/api/public;
        index index.html index.php;

    }

というのを加えて

curl http://localhost/api/user/

を叩いてみたんですがやはり 404 のまま PHP にすら渡ってる様子がないです
curl localhost/user は成功します


http://rufas.manyoldmoon.com/blog/1601 を参考にして

    location   /api {
        alias  /srv/www/localhost/current/api/public;
        index index.html index.php;

        location ~ \.(php|html)$ {
                fastcgi_split_path_info ^(.+?\.php)(/.*)?$;
                fastcgi_pass unix:/var/run/php-fpm/www.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $request_filename;
        }
    }

変わらず nginx 404 がでます


https://qiita.com/mogetarou/items/ceada1b5670ca15f50d9
というのを回答で教えていただいたんですが WP 用でどこをどう参考にしていいかわからず

fastcgi_split_path_info ^(.+\.php)(/.+)$;

というのがあったのでかいてみたんですが変化なし

その下にマルチサイトのサブディレクトリのルールというのがあって rewrite というのがあったので

    location   /api {
        if (!-e $request_filename) {
            rewrite ^/api(/.*\.php)$ $1 last;
        }

        location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            include fastcgi_params;
            fastcgi_pass unix:/var/run/php-fpm/www.sock;
            fastcgi_index index.php;
            fastcgi_param FUEL_ENV "<%= @env %>";
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }

という感じで /api を取り除いたものに rewrite してみたんですがやはり変化なし


https://qiita.com/mogetarou/items/ceada1b5670ca15f50d9
こちらは fuel の中に wp を alias でおく設定みたいなんですが alias と rewrite を両方使ってるみたいで

    location   /api {
        alias /srv/www/localhost/current/api/public;
        if (!-e $request_filename) {
            rewrite ^(.+)$ /api/index.php?q=$1 last;
        }
    }

    location ~ /.+.php$ {
        fastcgi_pass unix:/var/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        include fastcgi_params;
        fastcgi_param FUEL_ENV "<%= @env %>";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

とかいてみたところ
File not found.
というメッセージだけがかえってきました (nginx の用意した 404 ファイルではない)
いずれにしても PHP は反応せず


https://uzulla.hateblo.jp/entry/2014/03/28/221041

     location ~ ^/api.*/$ {
         rewrite ^(.*)$  $1/index.php last;
     }

     location ~ ^/api/(.*\.php)$ {
        alias /srv/www/localhost/current/api/public/$1;
        fastcgi_pass unix:/var/run/php-fpm/www.sock;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        include fastcgi_params;
        fastcgi_param FUEL_ENV "<%= @env %>";
    }

    location ~ /api/(.*)$ {
        alias /srv/www/localhost/current/api/public/$1;
    }

curl http://localhost/api/user/ は nginx 404 でかわらず
curl http://localhost/user も PHP ソースが表示されるようになってしまいました


人によって方法や書き方がバラバラで

location をネストさせるのか並列で並べるのか
rewrite だったり alias だったり script_name だったり何が正解なのかわかりません

ホスティングサーバーと Fuel のコントローラに渡す場合で違うんでしょうか…

どうも nginx の alias はディレクトリ位置を変更するためのもので
エンドポイント側を変更できるものではないんでしょうか…
エンドポイント側にプレフィックスをつけることは nginx ではできなくて apache を使うしかない感じでしょうか…