Nginx 配置仅将请求转发到 php laravel 服务器以获取带前缀的文件
回答问题 我有一个带有两个容器的 laravel 应用程序的 kubernetes 部署: NGINX 容器,接收请求并立即返回容器上的静态文件(图像、javascript、css..),或者,如果请求的文件不存在,则将请求代理到 PHP 容器 PHP容器运行laravel 它与以下 nginx 配置完美配合: server { listen 80; root /var/www/public; i
回答问题
我有一个带有两个容器的 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;
更多推荐
所有评论(0)