【问题标题】:Redirect files to simple form before downloading下载前将文件重定向为简单格式
【发布时间】:2009-04-20 03:08:24
【问题描述】:

您好,我正在尝试将指向我网站中任何 pdf 文件的所有链接重定向到一个页面,其中包含一个表单,该表单在用户继续下载/查看 pdf 之前收集用户信息。

例如

我想将网站中的 *.pdf 文件重定向到 request.php?file=name_of_pdf_being_redirected

request.php 是带有表单的页面,在继续之前要求提供一些详细信息。

站点中的所有 pdf 文件都保存在 /pdf 文件夹中。

有什么想法吗?

编辑:对不起,我在服务器上使用 Apache。

好的,我要到了: 我现在正在使用它:

重写引擎开启 RewriteRule ^pdf/(.+.pdf)$ request.php?file=/$1 [R]

但是现在当它进入下载页面时,当我想让该人实际下载文件时,我的新规则是将下载链接吐回表单:-P 哈哈,无论如何让它下载文件一次表单已提交,您正在下载.php?

【问题讨论】:

  • 尝试用 RewriteCond 来补充你的 RewriteRule。您也许可以通过 php 操作可以在 RewriteCond 中使用的变量。

标签: php pdf .htaccess redirect rewrite


【解决方案1】:

想法?您可以先告诉我们您使用的是哪个网络/应用服务器,这可能会有所帮助:-)

在 Apache 中,您应该能够使用 RewriteRule 将请求转换为不同的形式。例如,将/pub/docs/x.pdf 转换为request.php?file=/pub/docs/x.pdf 可以通过以下方式完成:

RewriteRule ^/pdf/(.*)\.pdf/  request.php?file=/$1.pdf

请记住,这是凭记忆(我接触 Apache 已有六年了,仍然干净 :-),格式可能略有不同。

更新:

现在你已经解决了这个问题,这里有几个选项可以解决你的下一个问题。

1/ 将 PDF 重命名为具有不同的扩展名,这样它们就不会被重写规则捕获。它们应配置为向客户端推送相同的 MIME 类型,以便它们在客户端选择的查看器中打开。

2/ 也将下载作为脚本的一部分,而不是作为对 PDF 的直接访问。由于表单的提交是一个 HTTP 请求,您应该能够立即使用 PDF 内容来回答它,而不是将它们再次重定向到下载页面。

第二个选项是我的选择,因为它:

  • 阻止人们仅仅通过请求 xx.pdfx 而不是 xx.pdf 就可以访问 PDF。
  • 使人们可以更快地获取 PDF(他们不必再次单击链接)。

【讨论】:

  • 试过了,没用 :-( 但是这让我更接近我想要的。它重定向。但是 request.php 页面上的所有图像现在都被破坏了,因为它已经移动了路径从 /images 到 /pdf/images RewriteEngine 上的图像 RewriteRule ^pdf/(.+\.pdf)$ request.php?file=/$1 [L]
  • 原来的 URL 是什么?通过重写删除“图像”位也是一件简单的事情。
  • 我现在可以使用它,但是出现了一个新问题。阅读以上部分。感谢您的帮助
【解决方案2】:

你可以试试这个:

  • 将文件移动到 Web 根目录“外部”的文件夹中,这样任何人都无法通过浏览器访问它
  • 使用会话检测某人是否已完成表单
  • 使用 php 驱动的文件下载脚本。最简单的形式可能是这样的:
if ( isset( $_SESSION[ 'OK_TO_DOWNLOAD' ] ) == false ) { header("位置:must_fill_this_first.php"); 退出(0); } header("内容类型:应用程序/pdf"); //仔细检查上面的内容,谷歌它,因为我不确定 echo file_get_contents( 'some_directory_inaccessible_thru_www/' . $_GET[ 'pdf_name' ] ); // 理想情况下,上面需要使用二进制安全函数

这是我在网站上使用的一种久经考验的技术。代码示例是一个草稿大纲,需要细化。

【讨论】:

    【解决方案3】:

    请注意,我的回答是针对 .NET 网站,但我确信 PHP 中的某处存在相同的构造。

    我将有一个带有 *.pdf 路径的 HTTPModule,它只是对 request.php?...等进行 Response.Redirect(在我的情况下为 request.aspx)然后在按钮的事件处理程序中单击该页面,当您知道要显示哪个 pdf 并且它们已获得授权时,只需执行 Response.ContentType = [PDF 的 MIME 类型],然后执行 Response.WriteFile(pdfFile),最后执行 Response.End()。

    您可以添加其他内容以使其更好,例如文件大小等。但在最小的情况下,这会起作用。如果你想要 C# 中的代码,我可以在大约 3 分钟内想出一些东西,但在 PHP 中我很迷茫。我会开始寻找 HTTPModules 以及如何用 PHP 编写它们。

    谷歌搜索“PHP HTTPModule”导致:Equivalent of ASP.NET HttpModules in PHP 所以,我可能有点错误,但希望这是一个起点。

    【讨论】:

      【解决方案4】:

      如果您使用的是 Apache Web 服务器,请使用 .htaccess 文件。您需要确保启用了 mod_rewrite,但一旦启用,您就可以使用以下两个简单的行重写所有文件:

      重写引擎开启 RewriteRule ^.pdf$ /rewrite.php [NC,L]

      如果您使用的是 IIS,则可以使用 ISAPI_Rewrite 完成类似的操作。

      您的另一种选择是将您的 pdf 文件放在不可公开访问的目录中,然后对 pdf 资源的任何请求都会返回拒绝访问错误,并且只能通过适当的下载脚本访问文件。

      【讨论】:

        【解决方案5】:
        if($user==authenticated){
         //set pdf headers
         echo file_get_contents('actual.pdf');
        

        没有模组重写,隐藏实际来源,这是我通常做的 - 希望这会有所帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-19
          • 2019-12-14
          • 2021-11-02
          • 2011-03-08
          • 2011-08-30
          相关资源
          最近更新 更多