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.