내 PHP에는 다음이 포함됩니다.
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5.socket;
include /etc/nginx/fastcgi_params;
}
위치별로 디렉터리의 파일에 대한 액세스를 허용하려고 합니다.
location ~ /internal {
allow IP;
deny all;
}
작동하지만 이 디렉토리의 PHP 파일을 다운로드할 수 있습니다.
답변1
명심하세요: Nginx는 항상 요청과 일치하는 위치 블록을 하나만 선택합니다. 검색 순서는 다음과 같습니다.
=
^~
None
~
~*
@
따라서 요청은 /internal/foo.php
접두사 위치와 /internal
먼저 일치한 다음 검색이 종료되고 정규식은 확인되지 않습니다. 이것이 PHP 파일을 요청할 때 다운로드 대화 상자가 나타나는 이유입니다.
중복을 피하려면 공통 지시문을 별도의 파일에 넣고include
지시문은 다음과 같습니다.
/etc/nginx/php.conf
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5.socket;
include /etc/nginx/fastcgi_params;
/etc/nginx/nginx.conf
location /internal {
allow IP;
deny all;
location ~ ^/internal(.*\.php)$ {
include php.conf;
}
}
location ~ \.php$ {
include php.conf;
}
답변2
다음과 같이 /internal 위치 내부에 PHP 위치를 추가해 보세요.
location ~ /internal/\.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5.socket;
include /etc/nginx/fastcgi_params;
}