订单已经付款,客户账户中也出现下载链接,点击后却是 Nginx 403。直接给 pub/media/downloadable 加公开 location 虽然能下载,但任何猜到路径的人都可能绕过订单权限。

分清403是谁返回的

响应是 Magento 页面,先查客户、订单、链接购买记录和允许下载次数;响应是 Nginx 默认页,查 Web 服务器 location 命中。保存 access log 中的 URI 与最终内部重写路径:

curl -I -b cookies.txt 'https://shop.example.com/downloadable/customer/products/'
nginx -T | grep -n -A8 -B3 'downloadable|media'

不要把带签名或密钥的完整下载 URL 写进共享工单。

安全的请求链

  1. 客户通过 Magento 路由发起下载;
  2. 应用校验客户、订单状态、次数与链接有效性;
  3. 校验通过后由应用流式输出,或通过内部重定向让 Nginx 发送文件;
  4. 媒体真实目录仍禁止外部直接访问。

如果使用 X-Accel-Redirect,内部 location 必须标记 internal,应用生成的内部路径与 alias 要一致。容器部署还要确认 PHP 和 Nginx 看到的是同一挂载点。

文件权限只需让运行用户可读,不要 777。验收时分别使用已付款客户、未购买客户、达到下载次数的客户和直接文件 URL;只有第一种应成功。