【问题标题】:How to show download button to redirected users from a specific website如何向来自特定网站的重定向用户显示下载按钮
【发布时间】:2020-07-16 23:17:22
【问题描述】:

我在 wordpress 上有一个免费软件下载站点。任何点击下载按钮的人都会被重定向到另一个网站页面,其中有该软件的下载链接。

示例: 单击“https://example1.com/510-2/”中的下载按钮,用户将被重定向到“https://example2.com/608/”。然后点击第二页顶部的“解锁下载链接”,页面底部隐藏的div(包含下载链接的按钮)可见。

问题: 因此,任何人都可以复制和分享第二个站点的 URL,而无需查看主站点页面 (https://example1.com)。

预期输出: 只有从“https://example1.com/510-2/”重定向的用户才能看到第二页顶部的“解锁下载链接”。如果有人试图复制并重新打开第二页 url“https://example2.com/608/”,将无法看到“解锁下载链接”div。

example2.com 帖子格式:

    
    <h2 style="text-align: center;"><strong>
    <a onclick='document.getElementById("download").style.display = "block";' href="#wait">Unlock Download Link</a>
    </strong></h2>
    
    <style>
    #download
    {display: none}
    </style>
    
    <p>Lorem Ipsum is simply dummy text</p>
    
    <div id="download">
    <a href="file download link" target="_blank" rel="noopener noreferrer">Download</a>
    </div>

【问题讨论】:

  • 您可以使用 php 执行此操作,方法是在单击按钮后发送一个 post 变量,然后检查第二页上的变量是否设置为您定义的值。一旦条件在 php 中签出,添加代码以在条件内向用户显示下载链接。如果有人只是直接访问该页面而没有在 post 数组中设置服务器 post 变量,则下载链接将不会显示。
  • 好像...现在我要学习php了。感谢@dalelandry 的帮助

标签: php .htaccess url redirect


【解决方案1】:

在 PHP 中执行此操作,您可以创建一个表单,将表单的 method 属性设置为 post 并将表单的 action 属性设置为指向托管可下载内容的 https://example2.com/608/ 页面为您的用户。然后在您的可下载内容页面上有一个条件检查是否设置了 $_POST 的全局数组,否则在重定向到您的初始页面时会引发错误。

表格如下所示:

注意:托管表单的页面需要是 .php 页面才能在该页面上使用 php

<form method="post" action="https://example2.com/608/">
  <?=$error?><!-- PHP for echo $error variable later defined I'll cover this later in explanation -->
  <input type="submit" value="Click Here" name="download">
</form>

提交此表单时,它将为输入namedownload 发送一个post 全局变量。在https://example2.com/608/ 页面上,它需要是一个 php 页面,您将在 html 的顶部有 php 代码,用于查看全局变量 $_POST 是否具有 download 的键。为此,您可以在条件 if 语句中的 php 中使用 isset()。类似于以下内容: if(isset($_POST['download'])) --> 如果 POST 全局在全局 POST 数组中设置了一个名为 download 的键。代码将评估条件,如果 $_POST 数组有 download 的键,它将返回 true。

在条件之上,你可以定义一个显示变量并将其设置为 NULL,然后如果条件返回 true,则设置该变量以显示可下载的内容。

类似:

$output = NULL;    

//--> now for the conditional that will see if the `$_POST` variable 
//--> is set and then define the $output variable to display the downloadable content
//--> or throw a redirect header back to the page you wish users to view prior to downloading 
//--> along with an error using the URL $_GET method
if(isset($_POST['download'])){
    $output = //--> add your downloadable html content here...
}else{
    header("Location: https://example1.com/510-2/?error");
    exit;//<-- EXIT THE PHP CODE!
}
//<-- If our evaluation was true we echo out the $output variable in our html
    
<div>
    <?=output?><!--// Short tag for php echo within html content on a php page //--> 
</div>

header("Location: https://example1.com/510-2/?error"); 将用户重定向回您的初始页面,然后通过可在目标重定向页面上使用的 url 发送一个 $_GET 全局变量。因此,在这里我们查看是否设置了 $_POST,如果是,我们会显示可下载的内容,否则如果未设置,我们会在允许用户下载内容之前自动将用户重定向到您希望显示的页面。我们本质上是通过我们希望他们获得奖品的链来引导用户:downloadable content,只有通过点击您希望他们点击的按钮才能设置帖子变量。

在 php 重定向 -> header() 中,您会看到在服务器上设置的另一个全局变量 ?error ? 只是在 url 帖子中定义键/值对的 url 的开始... error 只是键,不存在任何值。但是我们可以使用 PHP 重新检查我们的重定向页面,看看它是否已设置,就像我们对 $_POST 变量所做的那样。

现在在https://example1.com/510-2/ 上,我们有一些 PHP 代码检查 $_GET 全局数组中是否设置了“错误”,如果是,我们执行与在可下载内容页面上所做的相同的操作来检查,但我们使用$_GET 方法而不是 $_POST 方法。

if(isset($_GET['error'])){
    $error = 'Please review this info for downloadable content...';
}else{
    $error = '';
}  

现在在早期的 HTML 表单中,您注意到 echophp 短标签 -> &lt;?=$error?&gt; 这是直接在 php 页面 html 中使用的,这与 &lt;? php echo $error; ?&gt; 相同,也用于$output 变量也是如此。因此,如果条件评估为假,它只是什么都不回显,用户也看不到任何东西,如果它评估为真,我们知道用户在没有适当许可的情况下从可下载内容重定向回下载内容,它回显了指令我们希望他们采取以获取可下载的内容。

注意:我意识到这都是 php 代码,而不是您使用 javascript 的原始问题,但是因为您正在刷新页面并将用户引导到其他页面以获取内容,老实说,答案应该是使用像 PHP 或 AJAX 这样的服务器端语言。

这是基本的 PHP 代码,我解释的所有内容都可以在网络上轻松重新搜索,并且在 php 手册中进行了明确定义。在您的本地主机上创建几个虚拟页面,并使用 POST 和 GET 方法来优化您的代码。

https://www.php.net/manual/en/language.variables.superglobals.php https://www.php.net/manual/en/reserved.variables.get.php https://www.php.net/manual/en/reserved.variables.post.php https://www.php.net/manual/en/function.header.php
https://developer.mozilla.org/en-US/docs/Learn/Forms/Sending_and_retrieving_form_data

【讨论】:

  • 非常感谢您的帮助!
【解决方案2】:

您可以使用$_SERVER['HTTP_REFERER'] 超全局变量,如this SO question 中所述。

您的代码可能如下所示:

<?php
   $refr = $_SERVER['HTTP_REFERER'];
   if( strpos( $refr, `example.com` ) !== false) {
      echo '<button id="#theButton">Download</button>';
   } else {
      echo '<div class="warning">You must first visit <a href="#">this</a> website.</div>';
   }
?>

但是,这并非万无一失。如需更安全的方法,请考虑使用 .htaccess 文件,特别是 RewriteCond %{HTTP_REFERER} 指令。

Here is a SO question 讨论了如何做到这一点(例如,您可以有两个网页(一个带有下载按钮,一个带有错误消息)并根据访问者是否来过将其引导到相应的网页来自正确的网站)。

参考资料:

php - How to get referrer url

htaccess - Redirect based on referrer

【讨论】:

  • 谢谢!意义重大... :)
猜你喜欢
  • 2020-08-20
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 2019-09-23
相关资源
最近更新 更多