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

  • Автор темы Артем Талан
  • 72
  • Обновлено
  • 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

Тем
1

Постов
2

Баллов
12
  • 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

Тем
0

Постов
2

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

ulmen_ua


Рег
01 Jan, 2011

Тем
0

Постов
2

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

Евгений Биркле


Рег
07 Aug, 2011

Тем
1

Постов
3

Баллов
13
  • 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

Тем
1

Постов
3

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

Favorities


Рег
01 Jan, 2011

Тем
1

Постов
2

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

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

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

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

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

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

Дмитрий122


Рег
08 Oct, 2015

Тем
0

Постов
2

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

Vasylos


Рег
25 Jan, 2014

Тем
0

Постов
2

Баллов
2
  • 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

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

Ольга5


Рег
10 Sep, 2014

Тем
1

Постов
4

Баллов
14
Тем
49554
Комментарии
57426
Опыт
552966

Интересно