我的 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;
}