Обновление старого скрипта для обнаружения 404 ошибок

  • Автор темы Артем Талан
  • Обновлено
  • 18, May 2024
  • #1
Раньше я запускал этот скрипт на своей странице 404.

Он отправлял мне электронное письмо с каждой ошибкой 404. К сожалению, он больше не работает, это очень старый код. Может ли кто-нибудь помочь мне обновить его? Заранее спасибо.

 <?php
 $to = "[email protected]";
# Gather visitor information
 $ip = getenv ("REMOTE_ADDR"); // IP Address
 $server_name = getenv ("SERVER_NAME"); // Server Name
 $request_uri = getenv ("REQUEST_URI"); // Requested URI
 $http_ref = getenv ("HTTP_REFERER"); // HTTP Referer
 $http_agent = getenv ("HTTP_USER_AGENT"); // User Agent
 $error_date = date("D M j Y g:i:s a T"); // Error Date

$msg = "There was a ".$error_code." error on the ".$server_name." domain<br>".
 "\n\nDetails\n----------------------------------------------------------------------<br>".
 "\n<br>When: ".$error_date.
 "\n<br>(Who) IP Address: ".$ip.
 "\n<br>(What) Tried to Access: http://".$server_name.$request_uri.
 "\n<br>(From where) HTTP Referer: ".$http_ref.
 "\n\n<br>User Agent: ".$http_agent; 
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
$headers .= 'From: <[email protected]>' . "\r\n";
// send email
mail($to,"404 error report",$msg,$headers);

?>


Код (разметка):

Артем Талан


Рег
24 Dec, 2010

Тем
70

Постов
176

Баллов
546
  • 19, May 2024
  • #2
Некоторые из этих значений не передаются в среду, если вы используете PHP-FPM вместо fastCGI.

Попробуйте заменить большинство из этих getenv() на $_SERVER[].

Я бы, вероятно, также удалил все эти «переменные просто так» просто ради эффективности, и, поскольку вы создаете электронное письмо в формате HTML, создайте его как электронное письмо в формате HTML, убедившись, что htmlspecialchars содержит все значения, которые могут быть сгенерированы клиентом.

-сторона.

Также кажется, что он вызывает переменную $error_code, которая на самом деле нигде не определена.

Следовательно:

 <?php

$to = '[email protected]';

$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type:text/html;charset=UTF-8\r\n";
$headers .= 'From: <[email protected]>\r\n";

$message = '
<p>
There was a 404 error on the ' .
$_SERVER['SERVER_NAME'] . ' domain
</p>
Details
<hr>
When: ' .
date('D M j Y g:i:s a T') . '<br>
(Who) IP Address: ' .
$_SERVER['REMOTE_ADDR'] . '<br>
(What) Tried to Access: ' .
$_SERVER['REQUEST_SCHEME'] . '://' .
$_SERVER['SERVER_NAME'] . '/' .
htmlspecialchars($_SERVER['REQUEST_URI']) . '<br>
(From where) HTTP Referer: ' .
htmlspecialchars($_SERVER['HTTP_REFERER']) . '<br>
User Agent: ' .
htmlspecialchars($_SERVER['HTTP_USER_AGENT']);

// end message

// send email
mail($to, '404 error report' , $message, $headers);


Код (разметка): Наверное, я бы так и поступил.

Непроверено, возможно, есть опечатки, но общую суть должен дать. Десять центов за доллары, хотя реальная проблема в том, что getenv больше не передает эти значения.

Это происходит, когда вы переключаетесь между интерфейсами PHP, что является неотъемлемой частью переключения между серверами.

Следовательно, $_SERVER более надежен, чем getEnv для этих значений. Если это не то, без понятия.

Возможно, операционная система хоста блокирует или не сообщает об этом напрямую, что, как я знаю, начали делать некоторые «более дешевые» общие хосты; это лишь часть того, почему я отказался от этого типа хостинга 15 лет назад.
 

Romka1608


Рег
22 Nov, 2012

Тем
83

Постов
177

Баллов
622
  • 21, May 2024
  • #3
Я нашел «HTTP_REFERER», которого нет в конфигурации моего сервера. Это немного сложно. Я добавил скрипт php, чтобы получить конфигурацию сервера на веб-странице, и значение «HTTP_REFERER» отсутствует, когда я набираю URL-адрес страницы в своем браузере, потому что там нет реферера, но я могу получить его, если напишу этот URL-адрес на другой веб-странице со ссылкой, и реферер затем показывает, что он есть. ...
 

Ulmen_ua


Рег
01 Jan, 2011

Тем
68

Постов
194

Баллов
544
  • 03, Jun 2024
  • #4
Они все такие. Сегодня я получил 13 писем. Проблема в том, что он не дает URL-адрес отсутствующей страницы, поэтому это бесполезно... Это «request_uri», который не работает. Я не могу понять, почему.
 

Nakytoynak


Рег
07 Aug, 2011

Тем
76

Постов
194

Баллов
604
  • 04, Jun 2024
  • #5
Спасибо, вы мне помогаете!

У меня есть сервер Apache с версией PHP 7.2.31.

Когда я прошу:

 <?php
function apache_module_exists($module_name)
{
 $modules = apache_get_modules();
 foreach ($modules as $module)
 {
 if ($module == $module_name)
 return true;
 }
 return false;
}
var_dump(apache_module_exists('mod_headers'));
?>


Код (разметка): Я получаю много данных, все работает.

Но когда я спрашиваю:

 <?php print_r(apache_get_modules()); ?>


Код (разметка): Я получаю пробел.

Сервер этого не понимает.

Я также пробовал это:

 <?php phpinfo(); phpinfo(INFO_MODULES); ?>


Код (разметка): Но он работает не лучше.

Сценарий, о котором я говорю, начинается с добавления на мою страницу 404. Люди перенаправляются на эту страницу, если вводят неверный URI, и боюсь, мне придется найти другой способ узнать, откуда они пришли.

У меня нет планов менять сервер в ближайшее время.
 

Hyder


Рег
12 Feb, 2013

Тем
60

Постов
203

Баллов
553
  • 06, Jun 2024
  • #6
Затем я ввожу URI, которого не существует, меня перенаправляют на мой 404, все работает, кроме «HTTP_REFERER», который отсутствует. Я обратился в службу поддержки хостинговой компании. Я надеюсь получить быстрый ответ.
 

Favorities


Рег
01 Jan, 2011

Тем
68

Постов
204

Баллов
564
  • 07, Jun 2024
  • #7
Вероятно, он просто не передается из ОС или сервера.

На каком сервере он работает? Апач? НгНикс? Что-то другое? Многие более сложные «оптимизированные» серверные программы не предоставляют эту информацию в рамках подхода «давайте сделаем это быстрее», который часто просто замедляет работу.

Точно так же я помню, что если вы попытаетесь использовать Microsoft IIS в качестве хостинга, МНОГИЕ значения просто не передадутся в PHP.

(одна из многих причин, по которой я никогда не буду использовать Windows в качестве серверной ОС, она так же ужасна и ущербна, как Linux для настольных компьютеров.)

Иногда они также связывают ответ 404 таким образом, что указанная информация удаляется.

Каков стек программного обеспечения ОС/Сервера? Кто у вас хостинг? Может быть, они что-то отключили или отключили? Как вы справляетесь с этой ошибкой 404, использовали ли вы перенаправление, которое могло бы стереть эти данные?
 

Дмитрий122


Рег
08 Oct, 2015

Тем
53

Постов
204

Баллов
479
  • 09, Jun 2024
  • #8
Итак, я предполагаю простое: ', print_r($_SERVER), ''; Запускать как обычный повседневный .php (без перенаправлений или чего-то подобного). Не хватает значений, о которых мы говорим? Если да, то это почти наверняка «проблема» конфигурации сервера.
 

Vasylos


Рег
25 Jan, 2014

Тем
75

Постов
212

Баллов
607
  • 13, Jun 2024
  • #9
Велика вероятность, что это проблема с HTTP на HTTPS.

Ваш файл htaccess перенаправляет URL-адреса, отличные от https, на версии https.

Итак, когда люди собираются:

 
[URL='https://lumtu.com/yti/aAnnAaHBodHRwczovL2RvbWFpbi5jb20vNDA0LADN']https://domain.com/404.php[/URL]


Код (разметка): они перенаправляются на:

  [URL='https://lumtu.com/yti/aAccAaHBodHRwOi8vZG9tYWluLmNvbS80MDQuDM0']http://domain.com/404.php[/URL] 


Код (разметка): который затем перенаправляет на

  [URL='https://lumtu.com/yti/ZgccgZS9odHRwOi8vZG9tYWluLmNvbS9uby1wYWdlLWhlWLl']http://domain.com/no-page-here/[/URL] 


Код (разметка): это установка REQUEST_URI на «404.php» вместо исходного URL-адреса, который они посетили.

Покажите содержимое вашего файла htaccess, пожалуйста.

Это что-то вроде этого:

.htaccess

ОшибкаДокумент 404/404.php

перенаправление на https здесь

другие правила здесь

Попробуйте изменить порядок этих строк, переместите код перенаправления выше кода 404:

.htaccess

перенаправление на https здесь

ОшибкаДокумент 404/404.php

другие правила здесь
 

Wineeasek51


Рег
10 Sep, 2014

Тем
84

Постов
206

Баллов
646
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно