我想抓住传入的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"].
error.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
1条答案
按热度按时间koaltpgm1#
你设置
ErrorDocument
指令“不正确”。通过指定一个绝对URL(带有scheme和主机名),Apache触发了一个外部302重定向到错误文档(将错误文档暴露给用户),并且关于触发错误状态的URL的所有信息都会丢失。客户端看到的是302,而不是预期的错误响应代码。(事实上,401会完全失败,因为浏览器需要401响应来确定是否显示密码对话框。您应该使用根相对URL。举例来说:
现在,这会触发对错误文档的内部子请求(触发错误响应的URL仍然是浏览器的地址栏)。实际上,这里不需要传递错误代码,因为这在PHP超全局
$_SERVER['REDIRECT_STATUS']
中可用。PHP随后提供了许多与触发错误响应的URL相关的变量。例如,使用
$_SERVER['REDIRECT_URL']
(或$_SERVER['REQUEST_URI']
)获取触发错误/响应状态的URL。REQUEST_URI
还包含查询字符串(如果有的话),但REDIRECT_URL
只包含URL路径。HTTP
Referer
不是您需要的值。在这两种情况下(内部子请求和外部重定向),重定向器是从其请求触发错误状态的URL的URL(如果有的话)。换句话说,就是触发错误状态的URL之前的URL。注:我使用完整的URL的错误文件,因为它们是在主目录,我希望子目录的重定向到他们以及举行。因此,我不能使用
$_SERVER["REQUEST_URI"]
。我不确定你在这里试图解决什么“问题”,但是使用错误文档的根相对URL(以斜杠开头)不会导致这里的问题,并且允许任何URL(URL,子URL等)触发错误文档。(您不能在
ErrorDocument
指令中使用相对URL路径。注意:由于触发错误状态的URL的URL路径深度可能会有所不同,因此您必须在错误文档本身中使用指向静态资产(图像,CSS,JS等)的根相对URL路径,否则某些请求将无法找到它们。
参考文件:
这里的
RewriteRule
指令应该简单地读:你不需要匹配所有的东西,你只需要成功地处理所有的请求。替换字符串(即。
index.php
)在使用F
标志时被简单地删除-您应该简单地使用一个连字符来表示没有替换。当使用F
标志时,L
标志是隐含的,因此可以省略。没有必要重复
RewriteEngine On
指令。