Nginx 配置仅将请求转发到 php laravel 服务器以获取具有前缀的文件
Nginx configuration to only forward request to php laravel server for files with prefix
我有一个带有两个容器的 laravel 应用程序的 kubernetes 部署:
NGINX 容器,它接收请求并立即 returns 容器上的静态文件(图像、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";
}
}
问题来了:我需要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;
我有一个带有两个容器的 laravel 应用程序的 kubernetes 部署:
NGINX 容器,它接收请求并立即 returns 容器上的静态文件(图像、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";
}
}
问题来了:我需要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;