try_files는 어떻게 작동합니까?


72

나는 nginx 문서를 보았는데 여전히 혼란 스럽습니다.

어떻게 try_files작동합니까? 다음은 설명서의 내용입니다.

NginxHttpCoreModule에서

try_files

구문 : try_files path1 [path2] uri

기본 : 없음

컨텍스트 : 서버, 위치

가용성 : 0.7.27

파일이 있는지 순서대로 확인하고 발견 된 첫 번째 파일을 리턴합니다. 후행 슬래시는 디렉토리 $ uri /를 나타냅니다. 파일이 없으면 마지막 매개 변수로 내부 경로 재 지정이 호출됩니다. 마지막 매개 변수는 대체 URI이며 존재 해야 합니다. 그렇지 않으면 내부 오류가 발생합니다. 다시 쓰기와 달리 폴 백이 명명 된 위치가 아닌 경우 $ args는 자동으로 유지되지 않습니다. 인수가 보존되어야하는 경우 명시 적으로 수행해야합니다.

경로를 확인하는 방법과 내부 오류를 원하지 않지만 다른 파일을 찾기 위해 나머지 경로를 다시 시작한 경우 어떻게해야합니까?

캐시 된 파일 /path/app/cache/url/index.html을 시도하고 시도하지 못하면 /path/app/index.php어떻게 작성합니까? 내가 쓴 경우 :

try_files /path/app/cache/ $uri
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;

나는있다 index index.php index.html index.htm;. 내가 방문하면 /urlname확인 /path/app/cache/urlname/index.php을 시도 /path/app/cache/urlname/index.html합니까? 이후 try_files에 모든 것을 무시 try_files하면 캐시 폴더를 확인할 수 있습니까? 나는 노력하고 실패했습니다.

답변:


64

try_files는 정의 된 루트 지시문과 관련하여 지정한 리터럴 경로를 시도하고 내부 파일 포인터를 설정합니다. 예를 들어 try_files /app/cache/ $uri @fallback;with index index.php index.html;를 사용하면 다음 순서로 경로를 테스트합니다.

  1. $document_root/app/cache/index.php
  2. $document_root/app/cache/index.html
  3. $document_root$uri

마지막으로 @fallback이라는 이름의 위치로 내부적으로 리디렉션하기 전에. 파일 또는 상태 코드 ( =404)를 마지막 매개 변수로 사용할 수도 있지만 파일을 사용하는 경우 파일이나 존재해야합니다 .

try_files 자체는 마지막 매개 변수 외에는 내부 경로 재 지정을 발행하지 않습니다. 의미하는 것은 다음과 같습니다. try_files $uri /cache.php @fallback;nginx가 내부 파일 포인터를 $ document_root / cache.php로 설정하고 서비스를 제공하지만 내부 리디렉션이 발생하지 않기 때문에 위치가 재평가되지 않으므로 위치가 다시 평가되지 않습니다. 일반 텍스트로 제공됩니다. (인덱스로 PHP 파일과 함께 작동하는 이유는 인덱스 지시어 내부 리디렉션 발행하기 때문입니다)


2
훨씬 더 명확합니다. 감사. 명명 된 위치가 어떻게 작동하는지 잘 모르겠습니다. @fallback에 fastcgi php에 대한 줄이 있다면 텍스트 대신 PHP 파일로 사용합니까? 실패하기 전에 모든 것이 실패 할 때 사용됩니까?

2
명명 된 위치는 error_page 및 try_files와 같은 내부 메커니즘을 통해서만 액세스 할 수 있다는 점을 제외하면 기능적으로 일반 위치와 동일합니다. try_files의 폴백은 지정된 경로가 유효한 파일이없는 경우에만 사용됩니다. \ .php $ URI를 잡을 위치가 여전히 필요합니다. 그렇지 않으면 try_files는 파일이 존재하는 경우 $ uri에서 트리거하여 일반 텍스트로 제공합니다.
Martin Fjordvald

이 답변에 감사드립니다 .. 나는 여전히 여기에 질문이 있습니다 : try_files가 즉시 실행되거나 중첩 된 위치가 전에 시도됩니까?
Stphane

@Stphane 당신은 여기 어두운 물로 이동하고 있습니다. nginx의 상속은 복잡하고 지저분하며 완전히 일관성이 없습니다. 나는 이것을 기억하기 위해 이전 메모를 검토해야하므로 보장하지는 않지만 try_files의 경우 특히 중첩 된 위치 만 처리 할 때 내부 위치가 일치하면 실행되지 않는 것 같습니다. 그래도 테스트하는 것이 좋습니다.
Martin Fjordvald

5

명명 된 위치로의 무조건 리디렉션으로 try_files를 편리하게 사용하는 또 다른 방법이 있습니다. 명명 된 위치는 효과적으로 서브 루틴으로 작동하여 코드 중복을 줄입니다. try_files의 첫 번째 인수가 "_"인 경우 대체 리디렉션이 항상 사용됩니다.

    location =/wp-login.php { try_files _ @adminlock; }
    location ^~ /wp-admin/  { try_files _ @adminlock; }
    location @adminlock  {
            allow 544.23.310.198;
            deny all;
            try_files _ @backend;
            # wp-admin traffic is tiny so ok to send all reqs to backend 
    }
    location ~ \.php {  try_files _ @backend; }
    location / { try_files $uri $uri/ =403; }
    location @backend {
            fastcgi_pass 127.0.0.1:9000;
            include snippets/fastcgi-php.conf;
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.