我已经做了很多寻找答案的工作,但找不到合适的答案。
基本上,我有一个在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?
答案 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;
}