Nginx 中拒绝文件夹导致 PHP-FPM 不优先

Nginx 中拒绝文件夹导致 PHP-FPM 不优先

标题说明了一切,但我有一个非常有趣的问题,我对此感到很困惑。基本上,我有一个简单的 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;
        }

}

相关内容