我想在抛出错误时抓取传入的 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
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
包含它。)
参考: