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가 저에게 서비스를 제공하려고 한다고 알려줍니다. 홈/사용자/API/공개//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;

관련 정보