使用.htaccess与PHP处理错误时获取来源URL(引用页)
错误页面获取原请求URL的解决方案
问题场景
用户访问不存在的URL(如https://example.ca/missing-file123.php)时,通过.htaccess的ErrorDocument规则重定向到https://example.ca/error.php?error=404,但无法通过document.referrer或$_SERVER["REQUEST_URI"]获取原请求的URL——前者因服务器端重定向返回空值,后者因ErrorDocument使用完整URL而无法获取原请求路径。
解决方案
1. 修改.htaccess传递原请求信息
在ErrorDocument的跳转URL后追加原请求的路径和查询参数,利用Apache内置环境变量:
ErrorDocument 401 https://example.ca/error.php?error=401&url=%{REQUEST_URI}&query=%{QUERY_STRING} ErrorDocument 403 https://example.ca/error.php?error=403&url=%{REQUEST_URI}&query=%{QUERY_STRING} ErrorDocument 404 https://example.ca/error.php?error=404&url=%{REQUEST_URI}&query=%{QUERY_STRING} ErrorDocument 500 https://example.ca/error.php?error=500&url=%{REQUEST_URI}&query=%{QUERY_STRING}
%{REQUEST_URI}:存储原请求的路径部分(如/missing-file123.php)%{QUERY_STRING}:存储原请求的查询参数(若有)
2. 在error.php中接收并处理原URL
更新error.php代码,新增接收和拼接原请求URL的逻辑:
$error = ""; $errmsg = ""; $originalUrl = ""; if (isset($_GET['error'])) { if (in_array($_GET['error'], ['401', '403', '404', '500'])) { $error = $_GET['error']; // 拼接完整原URL if (isset($_GET['url'])) { $originalPath = urldecode($_GET['url']); $originalQuery = isset($_GET['query']) && !empty($_GET['query']) ? '?' . urldecode($_GET['query']) : ''; $originalUrl = "https://example.ca" . $originalPath . $originalQuery; } } else { header("location:/"); exit; } } else { header("location:/"); exit; } // 示例:输出原URL(需转义防止XSS) // echo "您访问的页面:" . htmlspecialchars($originalUrl) . " 不存在";
- 使用
urldecode()解码参数,还原原始路径和查询字符串 - 用
htmlspecialchars()处理输出,避免跨站脚本攻击 - 完全基于服务器端传递参数,不受浏览器referrer策略限制
兼容性说明
当前.htaccess中的Rewrite规则、安全拦截规则与新增的ErrorDocument参数传递无冲突——ErrorDocument在请求匹配不到资源时触发,优先级高于普通Rewrite规则,可正常生效。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

