$_SERVER['HTTP_REFERER']在HTTPS环境下无法正常工作,如何解决?
解决HTTPS环境下$_SERVER['HTTP_REFERER']无法获取的问题
处理浏览器跨协议安全限制
当从HTTP页面跳转到HTTPS页面时,多数现代浏览器会出于安全考虑不发送Referer头。你可以通过以下两种方式调整:- 在发起跳转的HTTP页面添加meta标签:
这个规则允许从HTTP跳HTTPS时发送Referer,同时保留HTTPS跳HTTP时不发送的安全限制。<meta name="referrer" content="no-referrer-when-downgrade"> - 直接在服务器端设置响应头:
Nginx配置示例:
Apache配置示例:add_header Referrer-Policy no-referrer-when-downgrade;Header set Referrer-Policy "no-referrer-when-downgrade"
- 在发起跳转的HTTP页面添加meta标签:
全站强制HTTPS
把网站所有HTTP请求重定向到HTTPS,让用户全程在HTTPS环境下操作。这样页面间跳转都是同协议,Referer头会正常发送。服务器配置示例:
Nginx:server { listen 80; server_name www.example.com; return 301 https://$server_name$request_uri; }Apache:
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]放弃依赖HTTP_REFERER,改用可靠方式传递来源
$_SERVER['HTTP_REFERER']本身就是浏览器可选发送的头,不管HTTP还是HTTPS环境都不能保证一定存在。如果业务逻辑必须获取来源,建议用更可靠的方式:- 通过URL参数传递:
跳转时携带来源信息:
目标页面获取:$sourceUrl = urlencode($_SERVER['REQUEST_URI']); header("Location: https://www.example.com/index.php?source={$sourceUrl}"); exit;$source = isset($_GET['source']) ? urldecode($_GET['source']) : ''; // 用$source替代原来的$_SERVER['HTTP_REFERER'] - 通过Session存储:
在跳转前把来源存入Session:
目标页面读取:session_start(); $_SESSION['referrer'] = $_SERVER['REQUEST_URI']; header("Location: https://www.example.com/index.php"); exit;session_start(); $referrer = isset($_SESSION['referrer']) ? $_SESSION['referrer'] : ''; unset($_SESSION['referrer']); // 用完销毁,避免干扰后续请求
- 通过URL参数传递:
内容的提问来源于stack exchange,提问作者Sagunthala
相关产品推荐
相关产品推荐

