标题说明了一切,但我有一个非常有趣的问题,我对此感到很困惑。基本上,我有一个简单的 WordPress 安装,我想拒绝一个文件夹(以及文件夹中的所有文件),比如说 /wp-content/themes/default/scripts,但允许某些 IP。
我可以拒绝该文件夹的位置,^~/wp-content/themes/default/scripts {deny all;}
就像任何 Nginx 专家会告诉你的那样。
但据我了解,“^”具有更高的优先级,一旦找到正则表达式匹配,它就会停止搜索其他位置块。由于我不想拒绝所有人访问该文件夹(当然,使用)allow (IP Address);
,我的^~/wp-content/...
位置块会完全取代我的 PHP-FPM 位置块,以将文件传递给 FastCGI 服务器。当然,当我尝试查看文件夹中的任何文件时,PHP 文件会直接下载,因为 PHP 不会解析它。
有人有主意吗?我想阻止该文件夹,但同时让 PHP 为我决定允许的用户工作。这是一个相当棘手的问题;我找不到任何答案。
谢谢大家!非常感谢你们的帮助!
如果有人想知道,我当前的 Nginx vhost 配置如下所示:
server {
#..all of the common stuff you would expect
include /folder/nginx.conf; #including some WordPress rewrites for W3 Total Cache
# pass the PHP scripts to FastCGI server listening on UNIX socket
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
fastcgi_read_timeout 1900;
}
location / {
#allowing some IPs...
#deny everyone else
deny all;
#WordPress rewrite for slugs
index index.php;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php last;
}
#rewrite for sitemaps
rewrite ^(.*/)?sitemap.xml /wp-content/sitemap.php last;
}
# denying access to .htaccess files
location ~ /\.ht {
deny all;
}
}
答案1
终于找到答案了。当你做这样的事情时,你需要重新声明 PHP-FPM 设置(块中的所有内容)location ~ \.php$ { (this code) }
。
因此,为了避免冗余,我将这些值放在另一个文件中,并留下如下内容:
server {
# pass the PHP scripts to FastCGI server listening on UNIX socket
location ~ \.php$ {
include /etc/nginx/fastcgi_php_text;
}
location / {
index index.php;
}
location ^~/folder/ {
deny all;
allow ...;
include /etc/nginx/fastcgi_php_text;
}
}
不知道这是否是最好的方法,但这是我能想到的唯一方法。
答案2
您还可以尝试定义通过@name 来定位并引用它。来自nginx 陷阱页面
server {
location ~ \.php$ {
try_files @fascgi;
}
location ^~ /folder {
deny all;
allow 127.0.0.1;
location ~ \.php$ {
try_files @fascgi;
}
}
location @fascgi {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}
}