【问题标题】:HTTP New location after download startsHTTP 下载开始后的新位置
【发布时间】:2010-06-06 16:36:29
【问题描述】:

我正在使用 X-Accel-Redirect(隐含 nginx)、Content-Type 和 Content-Disposition 来下载文件,一切正常。

我需要完成的是在下载开始后重定向到一个新位置。

我已经用 Refresh 和 Location 进行了测试,它不起作用。 HTTP 1.1/nginx 可以吗?

附录

我正在寻找一种仅限 HTTP 的方法。没有 javascript,没有

处理 POST 表单后开始下载。

【问题讨论】:

    标签: php http nginx


    【解决方案1】:

    一旦 Nginx 已经发送响应,这是不可能的。所以唯一的方法似乎是从你在X-Accel-Redirect中引用的Nginx位置返回302 Redirect

    你会如何告诉 Nginx 这样做?

    最好的方法是将自定义标头从应用程序传递给 Nginx(连同 XAR)

    如何在 Nginx 中触发处理?

    您可以使用变量$http_VARIABLE 轻松获取标头的值,因此典型的 Nginx 配置如下所示

    if ($http_your_header) {
      rewrite ^ http://your_redirect redirect;
    }
    

    请参阅Nginx rewrite module documentationNginx HTTP header variable 了解更多信息。

    【讨论】:

    • 如何在我的应用程序(发出 X-Accel-Redirect)中指示 nginx 获取参数(在本例中来自我的应用程序)并在开始提供该资源后执行 302?同样,不涉及 PHP 或 nginx 之外的任何其他“用户代码”。除此之外,我 +1 它,因为它最接近我的实际要求。
    • 将自定义标头传递给 Nginx(连同 XAR)
    • 如何在 nginx 中使用该标头的值并对其进行 302 处理?
    • if ($http_your_header) { rewrite ^ http://your_redirect redirect; }wiki.nginx.org/NginxHttpRewriteModulewiki.nginx.org/NginxHttpCoreModule#.24http_HEADER
    • 谢谢。你也可以把它放在答案中。
    【解决方案2】:
    <?php
    
    header('refresh:5;url=http://www.google.com/');
    header('Content-type: application/pdf');
    header('Content-Disposition: attachment; filename="file.pdf"');
    readfile('file.pdf');
    

    这将在 d/l 开始后 5 秒内将您重定向到 google.com ;)

    【讨论】:

    • readfile() 让 PHP 毫无意义地工作。我想使用正确的工具来完成这项工作,就像我已经使用 nginx 的 X-Accel-Redirect 一样。
    【解决方案3】:

    我会将原始下载链接更改为在新窗口中打开 (target="_blank") 并使用 javascript 进行重定向。您可以在此基础上尝试多种变体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      相关资源
      最近更新 更多