

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

* * *

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

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

[code]

     Alias /api "/srv/www/localhost/current/api/public"
    
[/code]

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

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

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

[code]

    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;
        }
    }
    
[/code]

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

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

* * *

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

[code]

        location   /api {
            alias  /srv/www/localhost/current/api/public;
            index index.html index.php;
    
        }
    
[/code]

というのを加えて

[code]

    curl http://localhost/api/user/
    
[/code]

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

* * *

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

[code]

        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;
            }
        }
    
[/code]

変わらず nginx 404 がでます

* * *

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

[code]

    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    
[/code]

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

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

[code]

        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;
            }
        }
    
[/code]

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

* * *

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

[code]

        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;
        }
    
[/code]

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

* * *

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

[code]

         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;
        }
    
[/code]

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

* * *

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

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

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

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


CC BY-SA 4.0
2019-07-31T05:35:13.163
57062
2019-08-06T09:10:06.867
2019-08-06T09:10:06.867
question
php nginx fuelphp
nginx + Fuel PHP でエンドポイントの alias 設定