Как заставить NGINX выполнять все URL в папке через index.php - PullRequest
4 голосов
/ 21 марта 2019

Я выполнил множество поисков ответа для этого и не могу найти подходящий ответ.

По сути, у меня есть сайт, созданный в SilverStripe, работающий на NGINX.Все это работает довольно хорошо, но я хочу, чтобы любые файлы / изображения, загруженные через администратора (в папку ресурсов), были разрешены через index.php в корне сайта (чтобы мы могли проверить разрешения файлов, установленных в администраторе, прежде чем возвращать их).пользователю).

У меня довольно простой конфиг nginx (для моего локального экземпляра докера):

server {
  include mime.types;
  default_type  application/octet-stream;
  client_max_body_size 0;
  listen 80;
  root /var/www/html;

  location / {
      try_files $uri /index.php?$query_string;
  }

  location ^~ /assets/ {
      try_files $uri /index.php?$query_string;
  }

  location /index.php {
    fastcgi_buffer_size 32k;
    fastcgi_busy_buffers_size 64k;
    fastcgi_buffers 4 32k;
    fastcgi_keep_conn on;
    fastcgi_pass   php:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;
  }
}

Проблема в строках:

  location ^~ /assets/ {
      try_files $uri /index.php?$query_string;
  }

К сожалению, try_files проверяет существование файла перед передачей запроса в php.Есть ли способ остановить это и передать все запросы из каталога assets прямо в PHP?

Ответы [ 2 ]

2 голосов
/ 21 марта 2019

try_files требуется два параметра, поэтому вы можете использовать фиктивное значение для замены термина file . Например:

try_files nonexistent /index.php$is_args$args;

Подробнее см. в этом документе .


Но более точное решение - это, вероятно, rewrite...last утверждение:

rewrite ^ /index.php last;

Директива rewrite автоматически добавит строку запроса. Подробнее см. в этом документе .

1 голос
/ 24 марта 2019

По-моему, просто слепо передавать все на правильный сценарий - это то, что нужно делать.

location /assets/ {
    include       fastcgi_params;
    fastcgi_param SCRIPT_NAME /index.php;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
    fastcgi_pass  php:9000;
}
...