Nginx 配置仅将请求转发到 php laravel 服务器以获取具有前缀的文件

Nginx configuration to only forward request to php laravel server for files with prefix

我有一个带有两个容器的 laravel 应用程序的 kubernetes 部署:

它与以下 nginx 配置完美配合:

server {
        listen 80;
        root /var/www/public;

        index index.html index.htm index.php;
        charset utf-8;

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

        error_page 404 /index.php;

        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
            include fastcgi_params;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|eot|ttf|woff|woff2)$ {
            expires 2d;
            add_header Cache-Control "public, no-transform";
        }
    }

问题来了:我需要return一些应该由laravel处理的加密文件(处理授权、认证和解密)。使用以下端点请求这些文件:

example.com/files/decrypt/path/to/file.jpg?token=tokentovalidaterequest

这样的请求会产生 nginx 错误和 404 响应(根据 nginx 日志,我将请求的路径替换为 $path):

2021/10/28 08:29:22 [error] 24#24: *1 open() "/var/www/public/files/decrypt/$path" failed (2: No such file or directory), client: 10.244.0.97, server: , request: "GET /files/decrypt/files/decrypt/$path?hash=$hash HTTP/1.1", host: "example.com"
10.244.0.97 - - [28/Oct/2021:08:29:22 +0000] "GET /files/decrypt/$path?hash=$hash HTTP/1.1" 404 6622 "https://example.com" "user-agent" "ip"

该请求实际上由 php 处理,原因是:

error_page 404 /index.php;

但是它丢失了 querystring 参数,我不希望我的 nginx 日志充满假错误。

有没有办法告诉nginx“如果该位置以/files开头,则直接将请求发送到php而不检查文件系统上是否存在该文件”?

我尝试添加:

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

location /块之前,但是我得到了一个nginx配置错误

实现此目标的正确方法是什么?

try_files 语句至少需要两个参数,参见this document。您可以添加一个假文件名作为第一个参数。

例如:

try_files nonexistent /index.php?$query_string;

或者,rewrite 语句也可以,请注意 rewrite 会自动附加查询字符串,请参阅 this document

例如:

rewrite ^ /index.php last;