apache 获取传入的URL(URL)时,处理错误与.htaccess & PHP

vltsax25  于 2023-10-23  发布在  Apache
关注(0)|答案(1)|浏览(128)

我想抓住传入的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
koaltpgm

koaltpgm1#

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(带有scheme和主机名),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

现在,这会触发对错误文档的内部子请求(触发错误响应的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路径,否则某些请求将无法找到它们。
参考文件:

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]

这里的RewriteRule指令应该简单地读:

RewriteRule ^ - [F]

你不需要匹配所有的东西,你只需要成功地处理所有的请求。替换字符串(即。index.php)在使用F标志时被简单地删除-您应该简单地使用一个连字符来表示没有替换。当使用F标志时,L标志是隐含的,因此可以省略。
没有必要重复RewriteEngine On指令。

相关问题