디렉토리 및 하위 디렉토리에 대한 액세스를 제한하는 방법


42

direstory "testdir"의 파일 또는 하위 디렉토리에 대한 액세스를 제한해야합니다. 내 conf :

...
location ~* ^.+\.(jpg|txt)$ {
            root   /var/www/site;
        }
location /testdir {
        deny all;
        return 404;
        }
...

내 구성에는 / testdir / jpg_or_txt-files에 대한 제한이 없습니다. 어떻게합니까?


필자의 경험에 따르면 위치 기능은 Linux에서 nginx를 실행할 때만 제대로 작동합니다. 창문에서 실행할 때, 우리는 이것이 작동하지 않는 문제가 발생했습니다 ...
samsmith

답변:


43

한 위치 항목에서 nginx의 여러 디렉토리에 대한 액세스를 제한하려면

...
location ~ /(dir1|dir2|dir3) {
   deny all;
   return 404;
}
...

7
404가 아닌 403을 반환해야합니다.
Stillmatic1985

12
이것은 전혀 질문에 대답하지 않습니다.

1
403을 반환하면 폴더가 존재한다는 힌트가 표시되고 404는 폴더가 존재한다는 증거를 제공하지 않습니다.
Don Wilson

23

"deny"지시문을 일치시키기 전에 "root"지시문이 일치하기 때문입니다. 지시문의 순서를 바꾸면 작동해야합니다.

...
location /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}
...

16

jpg / txt 일치 대신 testdir 일치가 선택되도록하려면 다음 위치를 사용하십시오.

location ^~ /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}

귀하의 예에는 두 가지 유형의 위치가 있습니다. 와 사이에 location /testdir물결표 ( ~) 가 없으므로 접두사 위치 입니다.location/testdir

location ~* ^.+\.(jpg|txt)$정규 표현식 위치 ( *물결표 바로 뒤의 대소 문자를 구분하지 않는 위치 )입니다. 로부터 의 nginx 문서 :

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

여기서 문제는 testdir 위치가 기억되고 있지만 정규식 단계에서 jpg / txt 위치가 선택되어 일치한다는 것입니다. 설명서의 다음 참고 사항은 솔루션을 기반으로 한 것입니다.

가장 긴 일치 접두사 위치에“^ ~”수정자가 있으면 정규식이 검사되지 않습니다.


11
location /foo {
    deny all;
    return 404;
}

이것은 모두 거부 때문에 항상 403을 줄 것입니다 ... 서버가 404를 제공하기를 원할 때 404 만 반환하면됩니다.

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