위치 경로의 Nginx 와일드 카드 / 정규식


22

내가 가지고있는 Nginx 설정은 다음 .php과 같이 404를 던졌습니다 .

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

그러나 하위 폴더에 실행하려는 index.php 파일이 있습니다. 현재 설정은 다음과 같습니다

location = /sitename/subpage/index.php {
    fastcgi_pass phpcgi; #where phpcgi is defined to serve the php files
}

location = /sitename/subpage2/index.php {
    fastcgi_pass phpcgi; 
}

location = /sitename/subpage3/index.php {
    fastcgi_pass phpcgi; 
}

완벽하게 작동하지만 문제는 중복 위치이며 많은 서브 페이지가 있으면 구성이 커집니다.

*와 같은 와일드 카드와 nginx 테스트는 통과했지만 404 페이지를로드하지 않는다는 정규식을 시도했습니다.

location = /sitename/*/index.php {
    fastcgi_pass phpcgi;
}

location ~* ^/sitename/[a-z]/index.php$ {
    fastcgi_pass phpcgi;
}

위치에 정규식 또는 와일드 카드로 경로 이름을 가질 수있는 방법이 있습니까?

답변:


32

블록 의 =수정자는 location와일드 카드, 접두사 일치 또는 정규식없이 정확하게 일치합니다. 그것이 작동하지 않는 이유입니다.

당신의 정규식 시도에서 [a-z]사이에 하나의 문자와 일치 a하고 z. 그것이 당신을 위해 작동하지 않는 이유입니다.

다음과 같이 위치를 설정해야합니다. location진술 의 순서를 기록하십시오 . nginx는 첫 번째 일치 정규식 조건을 선택합니다.

location ~ ^/sitename/[0-9a-z]+/index.php$ {
    fastcgi_pass phpcgi;
}

location ~ \.php$ {
    return 404;
}

여기서 대소 문자 구분 일치를 사용합니다 ( ~대신 수정 자 ~*). 첫 번째 경우, 경로의 첫 번째 부분을 찾은 다음 하나 이상의 알파벳 / 숫자 문자와 일치시킵니다 index.php. 일치 범위를 수정할 수 있지만 +"하나 이상"반복을 기억하십시오 .

두 번째는로 끝나는 모든 URI와 일치합니다 .php. 정규식이 작동하는 방식으로 인해 버전에 추가 문자가 필요하지 않습니다.


고마워, 네, 주요 반복은 정규 표현식에서 누락되었습니다. +고쳤다.

1

nginx의 "위치"설명 에서 순서가 중요합니다 .

주어진 요청과 일치하는 위치를 찾기 위해 nginx는 먼저 접두사 문자열 (접두사 위치)을 사용하여 정의 된 위치를 확인합니다. 그 중에서 가장 긴 접두사가있는 위치가 선택되어 기억됩니다. 그런 다음 구성 파일에 나타나는 순서대로 정규식이 검사됩니다. 정규식 검색은 첫 번째 일치시 종료되며 해당 구성이 사용됩니다. 정규식과 일치하는 항목이 없으면 이전에 기억 된 접두사 위치의 구성이 사용됩니다.

그 뜻은:

  • 첫째 =. ( "가장 긴 일치 접두사"일치)
  • 그런 다음 암시적인 것. ( "가장 긴 일치 접두사"일치)
  • 그런 다음 정규식. (첫 경기)

정규식 부품의 순서를 조정해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.