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

时间:2019-03-20 22:30:48

标签: php nginx silverstripe

我已经做了很多寻找答案的工作,但找不到合适的答案。

基本上,我有一个在NGINX上运行的SilverStripe构建的网站。一切正常,但是我希望通过管理员(上传到资产文件夹)上传的任何文件/图像都可以通过站点根目录中的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?

2 个答案:

答案 0 :(得分:2)

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

return

有关详细信息,请参见this document


但是更整洁的解决方案可能是一个try_files语句:

try_files nonexistent /index.php$is_args$args;

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

答案 1 :(得分:1)

在我看来,只是盲目地将所有内容传递给适当的脚本是 right(TM)要做的事情。

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