回答问题

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

  • NGINX 容器,接收请求并立即返回容器上的静态文件(图像、javascript、css..),或者,如果请求的文件不存在,则将请求代理到 PHP 容器

  • PHP容器运行laravel

它与以下 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";
        }
    }

问题来了:我需要返回一些应该由 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;

但它丢失了查询字符串参数,我不希望我的 nginx 日志充满虚假错误。

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

我尝试添加:

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

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

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

Answers

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

例如:

try_files nonexistent /index.php?$query_string;

或者,rewrite语句也可以工作,并注意rewrite将自动附加查询字符串,请参阅此文档。

例如:

rewrite ^ /index.php last;
Logo

开发云社区提供前沿行业资讯和优质的学习知识,同时提供优质稳定、价格优惠的云主机、数据库、网络、云储存等云服务产品

更多推荐