隐形链接(Cloaked Links)


有时需要隐藏文件的真实位置,同时仍允许用户访问。 例如,这个文件可以是存储在你服务器上的数字产品。在某人支付了必要的费用后,你应该让他访问这个档案,但不透露档案的真实位置。 在这种情况下,你还应将访问设置为临时的,即提供给用户的链接应仅在有限时间内有效。

你可以用 Couch 的 cloak_url 标签轻松完成上述所有操作。

为了大致了解 cloak_url,假设模板中的链接如下:

<a href="http://www.google.com" >Visit Site</a>

访问你的网站的用户只会看到“访问网站”,但无法隐藏这个链接指向谷歌的事实(将鼠标悬停在链接上,状态栏会显示 Goolgle,源代码中会显示谷歌链接等)。

现在请考虑对上面链接所做的以下修改——

<a href="<cms:cloak_url link='http://www.google.com' redirect='1' />" >Visit Site</a>

看看生成的网址,以及点击它如何仍然指向谷歌。这就是典型的“URL隐蔽”。
在上面的摘要中,我们将重定向参数设置为“1”,因为被隐蔽的链接是网页的链接,而非物理文件。

IMP。- 虽然使用文件cloak_url可以通过混淆链接来隐藏它们的真实位置,但你还需要确保文件不会被任何知道它们真实位置的人直接访问(例如通过智能猜测)——其中一种方法是使用.htaccess文件。 创建一个名为.htaccess的文件,输入以下几行,并放入存放受保护文件的文件夹中。

Options All -Indexes
deny from all

通过 Couch 可编辑的类型文件上传的文件默认保存在 'couch' 文件夹内的 'uploads/file' 文件夹中。这个文件夹里有一个名为“secure”的子文件夹,里面已经包含了所需的.htaccess文件。 你可以用这个文件夹来存放通过 Couch 上传的受保护文件。

 

假设一个图片文件test.jpg存储在上述的“uploads/file/secure”文件夹中(因此无法直接下载)。 将以下片段放入你的模板中——

<a href="<cms:cloak_url link='http://yoursite.com/couch/uploads/file/secure/test.jpg' />">Test Link</a>

 会显示一个链接,点击后应显示浏览器中(否则无法访问的)图片。

使用<cms:show k_admin_link/>来输出couch文件夹的完整URL总是个好主意,而不是硬编码。因此,上述片段将变为

<a href="<cms:cloak_url link="<cms:show k_admin_link/>uploads/file/secure/test.jpg" />">Test Link</a>

强制下载

如果上面隐藏的文件是压缩包,浏览器会显示熟悉的对话框,提示下载位置。 这是因为cloak_url试图确定链接文件的哑剧类型,并要求浏览器直接显示文件或提示下载。
如果你希望所有类型的文件都能显示下载框,可以把force_download参数设为“1”。 因此,以下链接始终会强制用户下载图片文件——

<a href="
    <cms:cloak_url
    link='http://yoursite.com/couch/uploads/file/secure/test.jpg'
    force_download='1'
    />
">Test Link</a>

通过将到期参数设置为秒数,可以使隐形链路在固定时间后失效。 因此,为了让链接仅有效24小时,可以使用以下摘要——

<a href="
    <cms:cloak_url
    link="http://yoursite.com/couch/uploads/file/secure/test.jpg"
    force_download='1'
    expiry='86400'
    />
">Test Link</a>

- 其中86400当然是24小时内的秒数(24 * 60 * 60)。

如果你看过用户和访问控制部分,你会记得 Couch 会给每个访客分配一个数字值,表示他的访问权限等级。这取决于用户所属的组——因此管理员的访问权限等级为7,而认证用户(特殊)的访问权限等级为4。未登录用户的访问权限等级为0。

通过设置access_level参数,链接可配置为仅限特定等级用户访问。

<a href="
    <cms:cloak_url
    link="http://yoursite.com/couch/uploads/file/secure/test.jpg"
    force_download='1'
    access_level='4'
    />
">Test Link</a>

在上面的片段中,只有访问等级等于或大于4的认证用户才能下载该图像文件。 如果未认证用户尝试访问这个链接,他们会看到空白屏幕。 要提示他们登录下载文件,请将prompt_login参数设为“1”——

<a href="
    <cms:cloak_url
    link="http://yoursite.com/couch/uploads/file/secure/test.jpg"
    force_download='1'
    access_level='4'
    prompt_login='1'
    />
">Test Link</a>

实战操作

我定义了2个字段如下,为了实现文件下载,并由用户控制是否会员下载和开放下载:

<cms:editable name='down_file' label='下载文件' desc='pdf,zip,rar格式' type='file' order='10'></cms:editable>
<cms:editable name='down_user' label='会员下载' type='radio' opt_values='开放下载=0 | 会员下载需要登录=2' validator='integer' order='15'></cms:editable>

对于下载方式的提示:

<cms:if down_user == '2'>
     <span class="down_badge users">登录下载</span>
<cms:else />    
     <span class="down_badge public">开放</span>
</cms:if>

对于下载文件的链接:

<cms:set mylink = "<cms:show down_file />" />
<cms:set userlevel = "<cms:show down_user />" />
<a href="<cms:cloak_url link=mylink force_download='1' access_level=userlevel prompt_login='1' />" class="down_icon"><i class="ri-download-cloud-2-line"></i></a>

注意使用<cms:set xxx />把变量获取,不要直接使用,防止字段的类型不对而使代码失效。