使用 .htaccess 和 PHP 处理错误时获取传入 URL(引用者)

问题描述 投票:0回答:1

我想在抛出错误时抓取传入的 URL。例如,如果用户输入“https://example.ca/missing-file123.php”,.htaccess 文件会将用户重定向到“https://example.ca/error.php?error=404”,因为“missing- file123.php”不存在,我想知道用户从“missing-file123.php”(或者任何不存在的 URL 可能是什么)来到“error.php?error=404”。我尝试过使用 javascript

document.referrer
,尽管它返回一个空值(我认为是因为 .htaccess 在客户端实际访问丢失的页面之前重定向?)。我正在寻找一种使用 javascript、PHP 或 htaccess 的解决方案,以在处理错误时获取或推送引荐来源网址。谢谢! (下面是我的htaccess和错误页面)。

错误文档:

ErrorDocument 401 https://example.ca/error.php?error=401
ErrorDocument 403 https://example.ca/error.php?error=403
ErrorDocument 404 https://example.ca/error.php?error=404
ErrorDocument 500 https://example.ca/error.php?error=500

注意: 我使用错误文档的完整 URL,因为它们保存在主目录中,并且我希望子目录也重定向到它们。因此我无法使用

$_SERVER["REQUEST_URI"].

错误.php:

$error = "";
$errmsg = "";
if (isset($_GET['error'])) {
    if (in_array($_GET['error'], ['401', '403', '404', '500'])) {
        $error = $_GET['error'];
    } else {
        header("location:/");
        exit;
    }
} else {
    header("location:/");
    exit;
}

这是我的 .htaccess 文件的其余部分,以防与解决方案发生冲突:

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^(www\.)?example\.ca$ [NC]
RewriteRule ^/?$ homedir/index.php [L]
RewriteCond %{HTTP_HOST} ^(www\.)?example\.ca$ [NC]
RewriteRule ^(?!homedir/)(.+)$ homedir/$1 [L,NC]

Options All -Indexes
IndexIgnore * 
<Files .htaccess>
Order Allow, Deny
Deny from all
</Files>

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule ^(.*)$ index.php [F,L]

ErrorDocument 401 https://example.ca/error.php?error=401
ErrorDocument 403 https://example.ca/error.php?error=403
ErrorDocument 404 https://example.ca/error.php?error=404
ErrorDocument 500 https://example.ca/error.php?error=500

DirectoryIndex index.php index.html 

SetEnv TZ America/New_York
javascript php apache .htaccess error-handling
1个回答
0
投票
ErrorDocument 401 https://example.ca/error.php?error=401
ErrorDocument 403 https://example.ca/error.php?error=403
ErrorDocument 404 https://example.ca/error.php?error=404
ErrorDocument 500 https://example.ca/error.php?error=500

您“错误”地设置了

ErrorDocument
指令。通过指定绝对 URL(带有方案和主机名),Apache 会触发到错误文档的外部 302 重定向,并且有关触发错误状态的 URL 的所有信息都会丢失。客户端看到的是 302,而不是预期的错误响应代码。 (事实上,401 会完全失败,因为浏览器需要 401 响应来确定是否显示密码对话框。)

您应该使用根相对 URL。例如:

ErrorDocument 401 /error.php?error=401
ErrorDocument 403 /error.php?error=403
ErrorDocument 404 /error.php?error=404
ErrorDocument 500 /error.php?error=500

这现在会触发错误文档的内部子请求。事实上,这里不需要传递错误代码,因为这在 PHP 超级全局中可用

$_SERVER['REDIRECT_STATUS']

检查

$_SERVER['REDIRECT_URL']
$_SERVER['REQUEST_URI']
以获取触发错误/响应状态的 URL。 (
REDIRECT_URL
包含 URL 减去查询字符串,
REQUEST_URI
包含它。)

参考:

© www.soinside.com 2019 - 2024. All rights reserved.