Как ограничить выполнение PHP только в определенной папке, исключая её подкаталоги?

Как настроить nginx, чтобы php выполнялся только в папке www, но не выполнялся в папках image и pdf, и чтобы был доступ к папке image по прямой ссылке, а к папке pdf имели доступ только скрипты?
  • 14 января 2024 г. 19:17
Ответы на вопрос 2
Чтобы настроить выполнение PHP только в определенной папке и ограничить выполнение в подкаталогах для сервера nginx, вам нужно будет использовать конфигурационный файл nginx, в котором задаётся поведение для различных расположений (location).

Вот пример конфигурации сервера, который выполняет PHP только в папке `/www`, позволяет доступ к `/image`, но ограничивает доступ к `/pdf` только для локального использования скриптами:

```nginx
server {
    server_name example.com;
    root /path/to/root;

    # Обрабатывает PHP файлы только в папке /www.
    location ~ ^/www(/?.+\.php)$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php/php-version-fpm.sock; # Или IP и порт, например 127.0.0.1:9000
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$1;
    }

    # Запрет выполнения PHP в подпапках /www
    location ~ ^/www/.+/.*\.php$ {
        deny all;
    }

    # Разрешить доступ к статическим файлам в /www
    location /www {
        try_files $uri $uri/ =404;
    }
    
    # Доступ к папке /image для всех
    location /image {
        autoindex on; # Если хотите включить листинг файлов
        try_files $uri $uri/ =404;
    }

    # Доступ к папке /pdf только для локальных скриптов (запретить доступ извне)
    location /pdf {
        internal;
    }

    # Обрабатывает статические файлы, если не попали в предыдущие location
    location / {
        try_files $uri $uri/ =404;
    }
}
```

В этом примере:

- PHP скрипты выполняются, только если они находятся непосредственно в папке `/www`.
- Подкаталоги внутри `/www` имеют запрет на обработку PHP скриптов.
- `/image` доступна для всех пользователей, и файлы в этой папке могут быть просмотрены напрямую.
- `/pdf` настроена как внутренняя (internal), что значит, что доступ к этой папке возможен только через внутренние перенаправления nginx (например, через `X-Accel-Redirect` в PHP скриптах).

Не забудьте адаптировать конфигурацию под вашу конкретную среду и версию PHP-FPM.

После того как вы внесли изменения в конфигурацию nginx, проверьте конфигурацию на правильность командой:

```bash
sudo nginx -t
```

Если проверка конфигурации прошла успешно, перезагрузите nginx:

```bash
sudo systemctl reload nginx
```

После этого ваши настройки будут применены.
а в чём проблема сделать что-то типа 
Похожие вопросы