laravel php artisan storage:link 后通过nginx代理访问图片404 not found问题
laravel php artisan storage:link 后通过nginx代理访问图片404 not found问题
提出问题
在使用 laravel 框架的 php artisan storage:link 命令创建软连接后,访问图片,直接访问没有问题,但是通过代理(如下代码)访问,就会提示:404 not found。
location /digital-api/ {
proxy_pass http://192.168.1.99:83/;
}
解决方案
经过排查发现,访问图片地址被当做接口请求了,这就意味着 nginx 代理匹配出现了问题,没有匹配到正确的代理路径,代理配置需要做如下更改:
location ^~ /digital-api/ {
proxy_pass http://192.168.1.99:83/;
}
分析说明
在询问 AI 之后,解释如下:
在 Nginx 配置中,^~
是一个特殊的字符,它的作用是指定一个最长匹配的 location。当 Nginx 处理请求时,它会查找与请求 URI 最长匹配的 location,并使用该 location 进行处理。如果没有找到精确匹配的 location,Nginx 会使用具有 ^~
前缀的最长匹配 location。
^~
的作用
- 最长匹配:
^~
确保 Nginx 使用最长的非正则表达式 location 匹配。如果没有^~
,Nginx 可能会选择一个较短的匹配,这可能导致请求被错误地路由。 - 优先级:在有多个 location 块可以匹配同一个请求时,带有
^~
的 location 块会优先于没有^~
的正则表达式 location 块。
为什么需要 ^~
在您的配置中:
location ^~ /digital-api/ {
proxy_pass http://192.168.1.99:83/;
}
- 没有
^~
的情况:如果请求的 URI 是/digital-api/some/path/to/image.png
,Nginx 可能会找到一个更短的匹配(例如location /
),并使用该 location 处理请求,导致请求被错误地代理或返回 404。 - 有
^~
的情况:使用^~
确保 Nginx 优先使用/digital-api/
这个最长匹配的 location,即使有其他更通用的 location 块(如location /
)存在。这样,请求就会被正确地代理到http://192.168.1.99:83/digital-api/some/path/to/image.png
。
解决方案
确保您的 Nginx 配置中使用了 ^~
来指定最长匹配的 location,这样可以确保请求被正确地路由到预期的后端服务。如果您的后端服务需要处理特定的路径或需要特定的 header,确保这些配置在正确的 location 块中设置。
检查网页链接的合法性
如果访问 http://192.168.1.99:83/
时遇到问题,可能是因为网络问题或链接本身的问题。请检查以下几点:
- 网络连接:确保您的设备可以访问
192.168.1.99
这个 IP 地址。 - 服务状态:确保
192.168.1.99
上的端口83
上的服务正在运行。 - 防火墙设置:检查是否有防火墙规则阻止了对该端口的访问。
- 链接格式:确保链接格式正确,没有多余的空格或特殊字符。
如果问题仍然存在,可能需要进一步的网络诊断或联系网络管理员。
原文地址:https://blog.csdn.net/dmt742055597/article/details/143721432
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!