Nginx: 特定のパス コンポーネントのエイリアス内で index.php にルートする

Nginx: 特定のパス コンポーネントのエイリアス内で index.php にルートする

特定のパスのエイリアス内の index.php への nginx ルートを作成しようとしています。サブドメインを使用する (および異なる名前のサーバーブロックを追加する) 方が簡単ですが、私のプロジェクトでは、いくつかの非トピック的な理由からこの構造が必要です。簡単に言うと、次のようになります。

1. www.example.com         --> /home/user/www/public/index.php
2. www.example.com/a/b     --> /home/user/www/public/index.php
3. www.example.com/api     --> /home/user/api/public/index.php
4. www.example.com/api/a/b --> /home/user/api/public/index.php

1 番目と 2 番目は標準的なものです。常に index.php ファイル (特定のルート内) を提供し、php にルーティングを任せます。3 番目はサブドメインの構築をシミュレートします (別のディレクトリの index.php を指す必要があります)。

1 から 3 まではうまくいきましたが、4 はうまくいきませんでした。www.example.com/api/a/b にアクセスすると、常に 404 が返されます。エラー ログには、nginx が /home/user/api/public//a/b/ を提供しようとしていることが示されています。解決にかなり近づいているように感じますが、うまくいっていないようです。同じ方法で静的ファイルも提供できると思います。

次の構成が関連します。

server {
    listen 80;
    server_name example.com www.example.com;
    root /home/user/www/public;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }
    location ~ \.php$ {
            try_files $uri /index.php =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_index   index.php;
            fastcgi_pass    unix:/var/run/php5-fpm.sock;
            include         fastcgi_params;
            fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    } 
    location /api {
        alias /home/user/api/public/;

        location ~ \.php$ {
           try_files $uri /index.php =404;
           fastcgi_split_path_info ^(.+\.php)(/.+)$;
           fastcgi_index   index.php;
           fastcgi_pass    unix:/var/run/php5-fpm.sock;
           include         fastcgi_params;
           fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
         }
    }      
}

前もって感謝します。

解決

server {
    listen 80;
    server_name example.com www.example.com;
    root /home/user/www/public;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }
    location ~ \.php$ {
            try_files $uri /index.php =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_index   index.php;
            fastcgi_pass    unix:/var/run/php5-fpm.sock;
            include         fastcgi_params;
            fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    } 
    location /api/ {
        alias /home/user/api/public/;
        try_files $uri /api/index.php =404;

        location ~ \.php$ {
           try_files $uri /index.php =404;
           fastcgi_split_path_info ^(.+\.php)(/.+)$;
           fastcgi_index   index.php;
           fastcgi_pass    unix:/var/run/php5-fpm.sock;
           include         fastcgi_params;
           fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
         }
    }      
}

答え1

かなり近いです。ただし、 の末尾の/文字locationとそれに対応するを一致させる必要がありますalias

また、try_files正しいindex.php(おそらく )を参照するために、そのブロックに を追加する必要があります/api/index.php

    location /api/ {
        alias /home/user/api/public/;
        try_files $uri /api/index.php;

関連情報