外部域名访问用户重定向至tracking.php跟踪页面的实现方案咨询
外部跳转跟踪重定向实现方案
以下提供三种不同场景的实现方式,可根据你的服务器环境选择:
方案1:Apache 服务器 .htaccess 配置实现
无需修改业务代码,直接在站点根目录新建/编辑 .htaccess 文件写入以下规则即可:
RewriteEngine On # 排除tracking.php本身,避免重定向死循环 RewriteCond %{REQUEST_URI} !^/tracking.php$ [NC] # 校验HTTP_REFERER是否不属于本站域名 RewriteCond %{HTTP_REFERER} !^https?://(www\.)?aaa\.com(/.*)?$ [NC] # 若不需要拦截空REFERER(用户直接在地址栏输入网址访问的场景),保留以下规则,否则删除 RewriteCond %{HTTP_REFERER} !^$ # 302临时重定向到tracking页面,追加QSA参数可保留原请求的查询字符串 RewriteRule ^(.*)$ /tracking.php?origin=$1 [L,R=302,QSA]
方案2:Nginx 服务器配置实现
在站点对应的server配置块中添加以下规则,重载Nginx配置后生效:
# 排除tracking.php避免死循环 if ($request_uri !~* "^/tracking.php$") { # 校验REFERER是否不属于本站域名 if ($http_referer !~* "https?://(www\.)?aaa\.com(/.*)?$") { # 若不需要拦截空REFERER,解除下一行注释与对应的闭合括号即可 # if ($http_referer != "") { rewrite ^/(.*)$ /tracking.php?origin=$1 redirect; # } } }
若需要使用永久重定向,将末尾的redirect改为permanent即可。
方案3:PHP 代码层全局实现
如果不方便修改服务器配置,在所有请求都会加载的公共入口文件(如框架入口index.php、全局公共头文件)的最开头加入以下逻辑:
<?php // 排除tracking.php自身,避免死循环 if (basename($_SERVER['PHP_SELF']) !== 'tracking.php') { $siteDomain = 'https://aaa.com'; $referer = $_SERVER['HTTP_REFERER'] ?? ''; // 校验REFERER是否不是本站开头 if (strpos($referer, $siteDomain) !== 0) { // 若不需要拦截空REFERER,在上述判断条件追加 && !empty($referer) 即可 // 跳转时携带用户原本要访问的地址 $redirectUrl = '/tracking.php?origin=' . urlencode($_SERVER['REQUEST_URI']); header('Location: ' . $redirectUrl); exit; } } ?>
注意:HTTP_REFERER由客户端浏览器主动上报,本身不具备强可靠性,存在被篡改、隐私模式下不发送的情况,该方案仅可覆盖大多数普通用户的访问场景。
内容的提问来源于stack exchange,提问作者Tomislav Tomi Nikolic
相关产品推荐
相关产品推荐

