0

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

例如

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

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

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

有任何想法吗?

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

好的,我要到了:我现在可以使用:

RewriteRule 上的 RewriteEngine ^pdf/(.+.pdf)$ request.php?file=/$1 [R]

但是现在当它进入下载页面时,当我想让这个人实际下载文件时,我的新规则是将下载链接吐回表格:-P 哈哈,所以一旦表格有,无论如何让它下载文件已提交并且您在 download.php 上?

4

5 回答 5

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(他们不必再次单击链接)。
于 2009-04-20T03:22:13.367 回答
0

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

我将有一个带有 *.pdf 路径的 HTTPModule,它只是对 request.php?...etc 执行 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所以,我可能有点错误,但希望这是一个起点。

于 2009-04-20T03:23:03.753 回答
0

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

RewriteEngine On RewriteRule ^.pdf$ /rewrite.php [NC,L]

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

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

于 2009-04-20T03:23:23.177 回答
0

你可以试试这个:

  • 将文件移动到 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' ] );
    // 理想情况下,上面需要使用二进制安全函数

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

于 2009-04-20T04:45:18.347 回答
0
if($user==authenticated){
 //set pdf headers
 echo file_get_contents('actual.pdf');

no mod re-writes, hides actual source and is what i normally do - hope this helps

于 2009-04-20T05:05:46.317 回答