我能够建立从HTTPS页面到另一个域上的HTTP页面的链接,并且仍然使用以下技术将第一页的URL作为引荐来源传递。
定义
原始页面:HTTPS页面,指向HTTP托管目标页面的链接位于该页面。在此示例中:https://example1.com/origin.html
目标页面:HTTP页面,可以访问原始页面的引荐来源网址。在此示例中:http://example2.com/destination.html
基本计划
这具有使重定向来自原始页面的HTTP版本的效果:
HTTPS原始页面上的链接链接到当前页面,但为目标页面添加查询参数[1]。例如:https://example1.com/origin.html?goto=http://example2.com/destination.html
单击链接后,如果存在查询参数“ goto”,example1.com上的服务器就会中断标准请求。然后:
- 将“ goto”参数存储在“ goto” cookie中。
- 从当前请求的网址中删除“ goto”参数和值
- 302重定向到原始域的HTTP版本上的此新清除的url,即。
http://example1.com/origin.html
服务器检查每个请求的“ goto” cookie,如果存在,将清除该cookie,然后呈现一个非常简单的重定向页面。该页面包含[2]:
- 一个Javascript window.location.replace()脚本,该脚本重定向到goto cookie url。
- 具有goto cookie url值和延迟几秒钟的元刷新标签。
- 转到goto cookie URL的链接。
笔记
[1]此基本解决方案是一个开放式重定向器,应考虑使用goto查询参数对网络钓鱼攻击中的UA进行重定向,以防止恶意分子入侵。
[2]当通过JS重定向或元刷新标记进行重定向时,并非所有浏览器都会发送引荐来源网址。在我的测试中,IE8及更低版本未通过引荐来源网址。
我不确定这种技术是否会让搜索引擎抓取工具跟踪链接。这对我的要求并不重要。
如果UA禁用了Cookie,则它将再次重定向到原始页面。
允许HTTP连接仅用于重定向
在我的服务器上,无论请求如何,我都有一个执行HTTPS的Apache规则:
<VirtualHost *:80>
ServerName example1.com
# if not on port 443 then 301 redirect to https while keeping any query string
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example1\.com$ [NC]
RewriteCond %{SERVER_PORT} !443
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,QSA,R=301]
为了使上面的重定向技术起作用,我需要某种方式来有条件地允许HTTP连接。有很多方法可以做到这一点。我决定使用cookie。
<VirtualHost *:80>
ServerName example1.com
# if not on port 443 then 301 redirect to https while keeping any query string
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example1\.com$ [NC]
RewriteCond %{SERVER_PORT} !443
RewriteCond %{HTTP_COOKIE} !disable_ssl [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,QSA,R=301]
disable_ssl cookie将在步骤2中设置,然后在步骤3中删除。
Origin
应该是完整的,但可能不适合你的使用情况。