You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:43:24