Назад | Перейти на главную страницу

Запрещение папки в 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 выглядит следующим образом:

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

Наконец нашел ответ. Когда вы делаете что-то подобное, вам нужно повторно объявить настройки 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;
        }
}

Не знаю, лучший ли это способ сделать это, но это единственный способ, который я понял.

Вы также можете попробовать определить блокировка местоположения по @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;
        }

}