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

nginx: запретить доступ к папке, кроме некоторых подпапок

Как можно запретить доступ к папке, но кроме некоторых подпапок в ней из «запретить»?

Я пробовал что-то вроде этого (в таком порядке):

# эта подпапка не должна быть запрещена, а скрипты php внутри должны быть исполняемыми

расположение ~ / data / public {разрешить все; }

# эта папка содержит множество вложенных папок, к которым следует запретить публичный доступ

расположение ~ / data {запретить все; возврат 404; }

... что работает неправильно. Файлы внутри папки / data / public доступны (все остальные в / data запрещены, как и должно быть), но файлы PHP больше не выполняются в папке / data / public (если я не добавлю эти ограничения, PHP файлы исполняемые).

Что случилось? Как это может быть правильно? Я думаю, есть лучший способ сделать это.

Было бы очень хорошо, если бы кто-нибудь мне в этом помог :).


Спасибо, но файлы PHP по-прежнему не выполняются в папке / data / public /, как простой

<? echo "test"; ?>

Он предоставляет вам этот файл для загрузки (без указанной выше конфигурации «deny» файлы php работают нормально).

Моя конфигурация PHP:

location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}

Файлы PHP во всех других каталогах вне / data / работают ... (также в других подпапках).

Причины, по которым файлы php не обрабатываются, заключаются в том, что когда они попадают в /data/public/ место, где он останавливается и не знает, как обрабатывать файлы php.

Попробуйте поместить свое местоположение php в другой файл с именем php.conf и включить этот файл в свой серверный блок и в /data/public/ блок. Итак, ваша конфигурация будет выглядеть примерно так

server {
    location ^~ /data/public/ {
        allow all;
        try_files $uri $uri/ /index.php?args;
        # include to avoid writing it twice..
        include php.conf
    }

    location ^~ /data/ { 
        deny all; 
    }

    # .....
    # Some other config blocks
    # .....

    # Put this line instead of the php config block to avoid writing the php part twice
    include php.conf
}

и php.conf файл будет выглядеть (в вашем случае) так:

location ~ \.php$ {
     fastcgi_split_path_info ^(.+\.php)(/.+)$;
     fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
     fastcgi_index index.php;
     include fastcgi_params;
}

Правило расположения должно выглядеть так.

location ^~ /data/                { deny all; }

или

location ^~ /data/public/               { allow all; }

Правила расположения nginx следующие

To find a location matching a given request, nginx first checks locations defined using the prefix strings (prefix locations). Among them, the most specific one is searched. Then regular expressions are checked, in the order of their appearance in a configuration file. A search of regular expressions terminates on the first match, and the corresponding configuration is used. If no match with a regular expression is found then a configuration of the most specific prefix location is used.

Правила доступа к nginx следующие

"Access rules are checked according to the order of their declaration. The first rule that matches a particular address or set of addresses is the one that is obeyed."

поэтому рабочая конфигурация должна выглядеть примерно так

location ^~ /data/public/               { allow all; }
location ^~ /data/ { deny all; }

При использовании deny all он должен возвращать 403 Forbidden, а не 404.

Это должно позволить доступ к общедоступному каталогу и его обработку, а все остальное заблокировать. У меня была такая же проблема, когда я работал над конфигурацией nginx для Magento, но я понял это с помощью трюка ^ ~.