2016-06-18 1 views
2

previous question,에서 Nginx를 .htpasswd 및 regex와 함께 사용하여/admin/및 sub-folders 디렉토리를 암호로 보호하려고했습니다.Nginx는 PHP 파일을 성공적으로 암호로 보호하지만 다운로드 할 것을 묻습니다.

성공적으로 완료되었지만 암호 인증이 완료된 후 Nginx는 PHP 파일을 단순히 다운로드하는 대신 "다운로드"하라는 메시지를 표시합니다.

새 위치 "인증"블록이 주석 처리 된 경우에는 발생하지 않습니다.

location/{ 
      try_files $uri $uri/ =404; 
    } 

    #location "~^/admin/.*$" { 
    #  try_files $uri $uri/ =404; 
    #  auth_basic "Restricted"; 
    #  auth_basic_user_file /etc/nginx/.htpasswd; 
    #} 

    location ~ \.php$ { 
      try_files $uri =404; 
      fastcgi_split_path_info ^(.+\.php)(/.+)$; 
      fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 
      fastcgi_index index.php; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      include fastcgi_params; 
    } 

가 어떻게이 (분명히 충돌) 위치 블록을 해결할 수 있으므로/관리/절에서는 암호가 여전히 PHP 파일을로드 아직 보호 : 예를 들어,이 코드 샘플에서, PHP 페이지는 문제없이로드?

답변

3

문제는 how nginx processes a request에 대한 근본적인 오해입니다. 기본적으로 nginx은 요청을 처리하기 위해 하나의 위치를 ​​선택합니다.

auth_basic이 필요한 위치 블록에서 /admin으로 시작하는 URI를 처리하려면 nginx이 필요합니다. 또한 .php으로 끝나는 URI는 PHP7로 보내야합니다.

두 개의 fastcgi 블록이 필요합니다. 하나는 일반 PHP 파일을 처리하고 다른 하나는 제한된 PHP 파일을 처리하는 것입니다.

location directive에는 여러 가지 형식이 있습니다. 정규식 위치가 정렬되어 있으므로 location "~^/admin/.*$" 블록이 location ~ \.php$ 블록이 /admin으로 시작하고 .php으로 끝나는 URI를 보지 못하게하는 것을 이미 확인했습니다. location ^~ 접두사 위치가 아닌 정규식

location/{ 
    try_files $uri $uri/ =404; 
} 

location ~ \.php$ { 
    try_files $uri =404; 

    include fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 
} 

location ^~ /admin/ { 
    auth_basic "Restricted"; 
    auth_basic_user_file /etc/nginx/.htpasswd; 

    try_files $uri $uri/ =404; 

    location ~ \.php$ { 
     try_files $uri =404; 

     include fastcgi_params; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 
    } 
} 

하는 것으로 :

깨끗한 솔루션은 중첩 위치 블록을 사용하고 정규식 위치보다 우선하는 접두사 위치를 강제로 ^~ 수정을 사용하는 것 위치.

location ~ \.php$ 블록에는 fastcgi_split_path_infofastcgi_index 지시어가 필요하지 않습니다.

+1

나를 위해 작동합니다. 페이지가 서버에서오고 브라우저 캐시의 부실 사본이 아닌 것은 확실합니다. 액세스 로그를 확인하십시오. –

+0

네 말이 맞아, 나는 프라이빗 모드에서 캐시하지 않을 것이라고 가정한다. 어리석은 나를. about : config에있는 모든 캐싱을 해제하고 이제는 완벽하게 작동합니다. 훌륭한 솔루션을 가져 주셔서 감사합니다. – some1