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