11

我拥有一个网站,其中包含许多可供下载的免费软件。我面临的问题是来自世界各地的人们正在获取文件的直接链接(例如 .zip 文件)并将它们发布在他们的网站和一般论坛上。我得到了大量的带宽,这没关系,但是访问的页面数量很少。有没有一种方法或脚本可以添加到链接中,这样当有人按下来自外国网站的链接时,会打开我网站的页面,然后让他下载文件,以便我获得更多访问。

例如,这是我网站上的地址:

http://sy-stu.org/stu/PublicFiles/StdLibrary/Exam.zip

当任何人按下它时,它将直接开始下载过程。

4

5 回答 5

21

您的站点由 Apache Web 服务器托管,因此您应该能够在站点的 httpd.conf(或虚拟主机块)中执行以下操作

RewriteEngine On
RewriteCond   %{HTTP_REFERER} !^$
RewriteCond   %{HTTP_REFERER} !^http://(www\.)?yourdomain\.com/  [NC]
RewriteRule   ^/PublicFiles/  /page-about-direct-links.html

这基本上是在说:

  1. 打开 mod_rewrite 引擎
  2. 如果 HTTP Referrer 不为空……</li>
  3. 并且不包含我的域名(带或不带“www.”)......</li>
  4. 将对 /PublicFiles/ 下的任何内容的任何请求重定向到 /page-about-direct-links.html

关于 mod_rewrite 的更多信息可以在这里找到:mod_rewrite - Apache HTTP Server

于 2008-12-27T15:32:00.607 回答
16

如果您使用的是 PHP,您可以拥有一个将用户链接到下载的脚本,但前提是该脚本$_SERVER['HTTP_REFERER']来自您的站点。如果不是,您将重定向到您的网站。

于 2008-12-27T14:20:23.683 回答
11

不要提供指向您正在提供的文件的直接链接。提供一个脚本,在您点击提交按钮后通过脚本发送内容。

进行网络搜索以通过 cgi 发送文件。

这是我在网上找到的一个简洁的链接: 这里

于 2008-12-27T15:10:30.837 回答
1

为什么不只是使链接动态和间接,例如:

第 X 页:(静态)

<a href="Y">SuperNeat Program</a>

在 Y 页上:(动态生成)

Click here to download 
<a href="Z.php?timestamp={timestamp}&counter={counter}&hash={hash}">
SuperNeat Program</a>

并将时间戳替换为自 1970 年以来以毫秒为单位的当前时间,计数器 = 每次下载时递增一次的计数器,哈希 = 连接的 MD5 哈希(时间戳,计数器,秘密盐)其中秘密盐 = 您保密的任何喜欢的代码。

然后在 Z.php 页面上,您只需从查询字符串中的计数器和时间戳重新计算哈希,检查它是否与查询字符串中的哈希匹配,并且时间戳是最近的(例如,从前 30 分钟或 60 分钟或任何)。如果是,则提供有问题的文件。如果不是,则抛出错误消息。这使某人只有很短的时间可以直接链接到您的文件。如果您甚至不想这样做,那么请跟踪 Z.php 查询字符串中收到的计数器值,并且不要多次接受它们。

于 2008-12-27T18:28:00.720 回答
0

我根本不是网络专家,但我在考虑以下指针 -

如果您使用的是 asp.net,可以 http 处理程序或在网站级别配置的模块提供帮助(有关网络上的大量信息,我最近查找了一些工作,例如,这里有一篇文章。

这个想法是在请求到达目标文件之前拦截请求并将其重定向到您希望显示的页面;例如 - 如果有人希望浏览到您发布的网址(“ http://sy-stu.org/stu/PublicFiles/StdLibrary/Exam.zip ”)拦截此调用,请使用一些查找来查找您的页面希望在那里显示和重定向请求;我猜跟随链接的用户不会太恼火(除非他们已经完成“将目标另存为”,这将导致他们保存一些 HTML 而不是 ZIP)。

但是,我的计划中存在一些“漏洞”——您如何实际提供可在您自己的页面上使用的链接?我相信您可以区分来自您网站的请求和来自其他网站的请求,您可以通过检查请求对象来检查处理程序/模块。

于 2008-12-27T15:18:38.060 回答