我的另一个想法是将用户的 IP 地址存储在数据库中,然后在打开“谢谢”页面时将其匹配,但是当用户是大型网络的一部分时,例如在大学中,这将无法正常工作。
向每个用户发送一个带有个性化名称的安装程序(例如 binary01、binary02、binary03...)。让安装程序在下载时读取自己的名称,并将其作为 GET 参数放入感谢页面,即http://www.yoursite.com/thankyou?exe=binary03
.
服务器上的二进制文件始终是同一个文件,但下载器会为每个附属公司报告不同的名称(或者您可以保留同一个二进制文件的多个副本,但这更难保持同步)。
例如,这可能是一个下载链接:
<?php
// Download URL, of the form http://www.yoursite.com/download.php?aff=AffName
// You can rewrite this with Apache's mod_rewrite and have .../filename-AffName.exe
$affiliates = array(
// You can keep these in a database
"widgets" => "Widgets'r'us",
"foobar" => "Foo's Software Bar",
);
$aff = isset($_GET['aff']) ? $_GET['aff'] : 'unaffiliated';
$base = "YourBinary";
$ext = '.exe';
$file = $base.$ext;
$name = $base.'-'.$aff.$ext;
Header("Content-Disposition: attachment; filename=" . urlencode($name));
Header("Content-Type: application/force-download");
Header("Content-Type: application/octet-stream");
Header("Content-Type: application/download");
Header("Content-Description: File Transfer");
Header("Content-Length: " . filesize($file));
readfile($file);
?>
至于如何读取包名,取决于安装程序。InnoSetup 会将信息导出为脚本变量{srcexe}
,Advanced Installer 会将其导出为 [SETUPEXEDIR],依此类推。
您可能希望将此提升为“首次安装注册”功能,但是,如果许多用户(例如在工作中、在网吧等)下载安装,然后在没有 Internet 连接的情况下运行它。您可能希望在安装时将“InstallationID”注册表值存储到附属名称(通过从可执行文件中读取它),然后程序可能会查找它并尝试将其交换为数字 ID 或 UUID(如果不是)。
通过这种方式,您可以两全其美,不会惹恼客户(“没有 Internet 连接就无法安装!Yeeech!”),甚至可以在讨价还价中获得一个 UUID。