如何让 NGINX 通过 index.php 执行文件夹中的所有 URL

How to get NGINX to execute all URL's in a folder via index.php

我为此搜索了很多答案,但找不到合适的答案。

基本上,我在 NGINX 上用 SilverStripe 运行 构建了一个站点。一切都很好,但我希望通过管理员(到资产文件夹)上传的任何 files/images 通过站点根目录中的 index.php 解析(这样我们就可以检查文件设置的权限在将它们返回给用户之前进行管理)。

我有一个非常简单的 nginx 配置(对于我的本地 docker 实例):

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 之前会检查文件是否存在。有没有办法阻止它并将资产目录中的所有请求直接交给 PHP?

try_files 需要两个参数,因此您可以使用虚拟值来替换 file 项。例如:

try_files nonexistent /index.php$is_args$args;

详情见this document


但更简洁的解决方案可能是 rewrite...last 语句:

rewrite ^ /index.php last;

rewrite 指令将自动附加查询字符串。有关详细信息,请参阅 this document

在我看来,只是盲目地将所有内容传递给正确的脚本是 正确的(TM)事情。

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