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

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

我想抓住传入的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文件和错误页面).
错误文档:

  1. ErrorDocument 401 https://example.ca/error.php?error=401
  2. ErrorDocument 403 https://example.ca/error.php?error=403
  3. ErrorDocument 404 https://example.ca/error.php?error=404
  4. ErrorDocument 500 https://example.ca/error.php?error=500

**注意:**我使用完整的URL的错误文件,因为它们是在主目录,我希望子目录的重定向到他们以及举行。因此,我不能使用$_SERVER["REQUEST_URI"].

error.php:

  1. $error = "";
  2. $errmsg = "";
  3. if (isset($_GET['error'])) {
  4. if (in_array($_GET['error'], ['401', '403', '404', '500'])) {
  5. $error = $_GET['error'];
  6. } else {
  7. header("location:/");
  8. exit;
  9. }
  10. } else {
  11. header("location:/");
  12. exit;
  13. }

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

  1. RewriteEngine on
  2. RewriteCond %{HTTP_HOST} ^(www\.)?example\.ca$ [NC]
  3. RewriteRule ^/?$ homedir/index.php [L]
  4. RewriteCond %{HTTP_HOST} ^(www\.)?example\.ca$ [NC]
  5. RewriteRule ^(?!homedir/)(.+)$ homedir/$1 [L,NC]
  6. Options All -Indexes
  7. IndexIgnore *
  8. <Files .htaccess>
  9. Order Allow, Deny
  10. Deny from all
  11. </Files>
  12. Options +FollowSymLinks
  13. RewriteEngine On
  14. RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
  15. RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
  16. RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
  17. RewriteRule ^(.*)$ index.php [F,L]
  18. ErrorDocument 401 https://example.ca/error.php?error=401
  19. ErrorDocument 403 https://example.ca/error.php?error=403
  20. ErrorDocument 404 https://example.ca/error.php?error=404
  21. ErrorDocument 500 https://example.ca/error.php?error=500
  22. DirectoryIndex index.php index.html
  23. SetEnv TZ America/New_York
koaltpgm

koaltpgm1#

  1. ErrorDocument 401 https://example.ca/error.php?error=401
  2. ErrorDocument 403 https://example.ca/error.php?error=403
  3. ErrorDocument 404 https://example.ca/error.php?error=404
  4. ErrorDocument 500 https://example.ca/error.php?error=500

你设置ErrorDocument指令“不正确”。通过指定一个绝对URL(带有scheme和主机名),Apache触发了一个外部302重定向到错误文档(将错误文档暴露给用户),并且关于触发错误状态的URL的所有信息都会丢失。客户端看到的是302,而不是预期的错误响应代码。(事实上,401会完全失败,因为浏览器需要401响应来确定是否显示密码对话框。
您应该使用根相对URL。举例来说:

  1. ErrorDocument 401 /error.php?error=401
  2. ErrorDocument 403 /error.php?error=403
  3. ErrorDocument 404 /error.php?error=404
  4. 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路径,否则某些请求将无法找到它们。
参考文件:

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

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

  1. RewriteRule ^ - [F]

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

展开查看全部

相关问题