php - Nginx 显示正确的重写数据,但未按预期执行
问题描述
我有一个使用 fastcgi 在 Nginx 后面运行的 laravel 应用程序。www.example.com/media/images/someImage.jpeg上提供了图片
在www.example.com/media/images/660x440/someImage.jpeg上还有相同图像的不同尺寸的图像
如果在www.example.com/api/images/660x440/someImage.jpeg上不存在此图像,则在 laravel 上运行一个脚本可以使该图像可用于此大小
例如,如果www.example.com/media/images/660x440/someImage.jpeg不存在,则可以访问www.example.com/api/images/660x440/someImage.jpeg ,这将显示图像,现在也显示此图像存在于www.example.com/media/images/660x440/someImage.jpeg下,希望这是有道理的。
好的,所以我现在想弄清楚的问题是如何通过 nginx 重写来实现这一点。
想法是当用户尝试访问 www. example.com/media/images/660x440/someImage.jpeg 并且它不存在,nginx 将其重写为 /api/images/660x440/someImage.jpeg (脚本)并显示生成的图像,但这一切都没有改变网址。所以请求的 URL 保持为 www。example.com/media/images/660x440/someImage.jpeg 但在后台它请求 /api/images/660x440/someImage.jpeg 处的脚本并在同一 www 显示生成的图像。example.com/media/images/660x440/someImage.jpeg。
我的 nginx 配置如下
server {
listen 8080;
root /var/www/public;
index index.php index.html index.htm;
client_max_body_size 100M;
resolver kube-dns.kube-system.svc.cluster.local; #this is for rancher purposes
set $target app-fpm.app.svc.cluster.local; #also this
error_log /var/log/nginx/error.log notice;
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
location /media/images/ {
alias /var/www/storage/app/public/media/images/;
try_files $uri /$uri @generator;
}
location @generator {
rewrite ^/media/images/(.*) /api/images/$1 last;
}
location ~ ^/.+\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_pass $target:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
我已经在 nginx 中启用了重写调试,并且在错误日志中我可以看到这个 -
2020/09/11 23:14:28 [notice] 1034#1034: *161 "^/media/images/(.*)" matches "/media/images/660x440/someImage.jpeg", client: 10.42.0.0, server: , request: "GET /media/images/660x440/someImage.jpeg HTTP/1.1", host: "www. example .com"
2020/09/11 23:14:28 [notice] 1034#1034: *161 rewritten data: "/api/images/660x440/someImage.jpeg", args: "", client: 10.42.0.0, server: , request: "GET /media/images/660x440/someImage.jpeg HTTP/1.1", host: "www. example .com"
如您所见,重写的数据是正确的,它是 /api/images/660x440/someImage.jpeg,但根据 access.log 显示 404 错误
10.42.0.0 - - [11/Sep/2020:23:33:43 +0300] "GET /media/images/660x440/someImage.jpeg HTTP/1.1" 404 622 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36"
但它应该显示新生成的图像。这甚至可能是我在这里想要实现的吗?
非常感谢您的帮助,谢谢!
解决方案
推荐阅读
- python - 如何在事先不知道课程的情况下填充工厂?
- python - 绘制此图的公式是什么?
- sql - 我的 SQL 链接服务器的名称已更改。我有一堆使用旧名称的查询和存储过程。有什么我可以做的吗?
- excel - 动态构建多维数据集连接
- python - 将列表附加到列表不会生成列表列表
- html - 如何在不覆盖我的自定义 css 的情况下将 Glyphicons 添加到我的 Flask 应用程序?
- swift - DCDevice 在 macOS 上不起作用。`com.apple.devicecheckd` 已失效
- java - 无法理解禁用按钮行为
- c++ - cudaMemcpyAsync() 在第二次内核调用后不同步
- sql - 从 SQL Server 的 group by 子句中包含不同字符串值的结果中获取最大值