有时需要隐藏文件的真实位置,同时仍允许用户访问。 例如,这个文件可以是存储在你服务器上的数字产品。在某人支付了必要的费用后,你应该让他访问这个档案,但不透露档案的真实位置。 在这种情况下,你还应将访问设置为临时的,即提供给用户的链接应仅在有限时间内有效。
你可以用 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 />把变量获取,不要直接使用,防止字段的类型不对而使代码失效。