2016-10-20 2 views
3

Nginx로 "Apache Alias"와 비슷한 위치를 설정하려고했지만이 폴더에서 PHP 스크립트를 처리 할 수 ​​없습니다. 내가 다른 솔루션을 시도했지만 그들 중 누구도이 작동하지 않습니다Nginx - 다른 디렉토리와 PHP에 루트가있는 위치

/var/www 
+- dev/public/ <-- This is my normal Web root : "/" 
| +- assets/ 
| | +- app.css 
| | +- app.js 
| | 
| +- index.php 
| +- favicon.png 
|  
+- cut/public/ <-- This must like an "Apache Alias" : "/cut" 
    +- assets/ 
    | +- app.css 
    | +- app.js 
    | 
    +- index.php 
    +- other_other_file.php (why not) 

:

여기 (데브 환경) 내 폴더 구조입니다. 이것으로

server { 
    listen 80; 

    server_name _; 
    root /var/www/dev/public/; 
    index index.php index.html; 
    autoindex on; 

    # Logs 
    rewrite_log on; 
    error_log /var/log/nginx/error.log; 
    access_log /var/log/nginx/access.log; 

    # Serving files 
    location/{ 
     try_files $uri $uri/ @php; 
    } 

    location /cut { 
     root /var/www/cut/public; 
     try_files $uri $uri/ @php; 
    } 

    # PHP 
    location @php { 
     rewrite ^(.*)/?$ /index.php$is_args$args last; 
    } 

    location ~* \.php(/|$) { 
     fastcgi_pass php:9000; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; 
     fastcgi_param DOCUMENT_ROOT $document_root; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include fastcgi_params; 
    } 
} 

, 내 cut/public/ 폴더의 모든 함유량 dev/public/index.php로 리디렉션 및 (원인 나는 가정, try_file의) 해석 : 여기

최선 Nginx의 구성입니다.

귀하의 도움이 환영받을만한 이유입니다.

최종 솔루션

@의 대답 리처드 스미스는, 여기에 구현 된 솔루션입니다 후 :

server { 
    listen 80; 

    server_name _; 
    root /var/www/dev/public/; 
    index index.php index.html; 

    error_log /var/log/nginx/error.log; 
    access_log /var/log/nginx/access.log; 

    location ^~ /cut { 
     rewrite ^/cut/?(.*)$ /cut/public/$1 last; 
    } 

    location ^~ /cut/public { 
     root /var/www/; 
     try_files $uri $uri/ /cut/index.php$is_args$args; 

     location ~* \.php(/|$) { 
      fastcgi_pass php:9000; 
      fastcgi_split_path_info ^(.+\.php)(/.*)$; 
      fastcgi_param DOCUMENT_ROOT $document_root; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      include fastcgi_params; 
     } 
    } 

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

    location ~* \.php(/|$) { 
     fastcgi_pass php:9000; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; 
     fastcgi_param DOCUMENT_ROOT $document_root; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include fastcgi_params; 
    } 
} 

답변

3

두 PHP 애플리케이션을 실행 나란히, 당신이 중 하나가 공통의 문서 루트가 필요합니다 정확한 SCRIPT_FILENAME이 fastcgi 백엔드로 전송되도록 두 개의 location ~* \.php (또는 이와 유사한) 블록이 필요합니다.

사용은 /cut 하위 디렉토리를 분리하고 (this documentation 참조)을 방해하는 다른 최고 수준의 정규 표현식을 location 블록을 피하기 위해 상위 레벨에서 ^~ 수정을 사용하는 location 블록을 중첩.

alias 지침 (this documentation 참조)가 /var/www/cut/public/cut에 매핑하는 데 사용된다. root 지시어는 연결 만 가능하며 /var/www/cut/public/cut (원하지 않는)으로 지정됩니다.

this long term issue 때문에 try_files 지시문을 사용하여 alias 지시문을 사용하지 않는 것이 좋습니다.

따라서 해결책은 /cut/cut/public으로 자동으로 다시 쓰고 root /var/www 값을 사용하는 것입니다. 예를 들어

:

location ^~ /cut { 
    rewrite ^/cut(.*)$ /cut/public$1 last; 
} 
location ^~ /cut/public { 
    root /var/www; 
    try_files $uri $uri/ /cut/index.php$is_args$args; 

    location ~* \.php(/|$) { 
     fastcgi_pass php:9000; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; 
     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    } 
} 
+0

니켈 수소, I'try이 있지만'컷/public' 비 PHP 파일에 대해 무엇을? 'try_file'이 작동할까요? (왜냐하면 루트는'/ var/www/cut/public'이 아닌'/ var/www'가 되었기 때문입니다)? – Akarun

+0

예. 정적 파일에 대한 URI는'/ cut/assets/app.js'이며 첫 번째 블록에 의해'/ cut/public/assets/app.js'로 자동 변경되고'/ var/www/cut/public/assets/app.js'를'root' 및'try_files' 지시자로 대체합니다. –

+0

네, 일합니다. 그러나'/ cut'에 문제가 있습니다 :이 호출은 리디렉션을하고'/ cut/public'을 URI로받습니다. 아마 내가 PHP 백엔드를 호출하기 전에 그것을 제거해야합니까? – Akarun