Почему функция PHP «требуется» перестраивает мой HTML?

#php #html

Вопрос:

Я внедрил систему проверки для своего веб-сайта, где каждый раз, когда пользователь запрашивает страницу, запускается PHP-скрипт, который проверяет, вошел ли пользователь в систему в данный момент. Если нет, то пользователь перенаправляется на страницу входа в систему. Это делается с помощью одного «redirect.php» файл, который «требуется» для каждой страницы, используя синтаксис <?php require 'redirect.php' ?> .

На каждой странице, содержащей приведенное выше утверждение, весь код в <head> элементе удален и помещен в начало <body> . Кроме того, сущность HTML вставляется в кавычки: "amp;#xFEFF; " .

В результате в DevTools мой HTML выглядит следующим образом: изображение кода в DevTools

В то время как в моем редакторе это выглядит так:

 <?php require 'redirect.php' ?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <h1>Stuff</h1>
</body>
</html>
 

Я знаю, что код внутри ‘redirect.php файл не имеет значения, потому что даже если я опустошу этот файл, я получу то же самое странное поведение. Я проверил наличие невидимых символов юникода, которые каким-то образом попали в мой код; их нет.

Кто-нибудь знает, что это такое и как это исправить?

Если это поможет, я с бесконечно свободным хостингом.

Комментарии:

1. При попытке отладить ответ с сервера не смотрите на HTML в devtools. Щелкните правой кнопкой мыши на странице и выберите вместо этого «Просмотреть источник страницы». То, что вы видите в devtools, — это то, что использует браузер, которое может быть изменено (если браузер решит, что ему нужно что-то «исправить» с исходным кодом), в то время как «Просмотр источника страницы» покажет вам, что именно возвращает сервер

2. Некоторая справочная информация и часто задаваемые вопросы: w3.org/International/questions/qa-utf8-bom.en.html

3. @MagnusEriksson Большое спасибо, я никогда не думал просматривать источник. Это отображает HTML в том виде, в каком я его написал. Я полагаю, что приведенный ниже ответ объясняет, почему это так.

Ответ №1:

amp;#xFEFF; это знак порядка байтов.

Требуемый файл должен быть сохранен в формате, начинающемся с единицы (обычно UTF-8 с указанием спецификации).

Он вставляется в ваш выходной поток в виде символа. Поскольку это недопустимый символ перед началом элемента body, он неявно запускает элемент body (а также элементы html и head) и вставляется в его начало.

Затем инспектор DOM нормализует его как объект HTML, поскольку он не является видимым символом.

Когда остальная часть документа проанализирована, часть того, что вы намеревались поместить в заголовок, заполняется с помощью правил восстановления ошибок HTML 5.


Проверьте свой редактор и убедитесь, что формат файла, в котором вы сохраняете файлы PHP, не содержит спецификации.

Ответ №2:

Как было указано в ответе, amp;#xFEFF; представляет собой метку порядка байтов (BOM). Квентин был так добр, что прояснил это пораньше.

И, как вы уже выяснили, <?php require 'redirect.php' ?> вставляет его.

Однако с тем, что вы испытываете, есть нечто большее. Вы не поделились версией своего браузера, но одна только спецификация в верхней части redirect.php не приведет к проблеме, которую вы смогли продемонстрировать (с помощью обычного браузера).

Вот в чем разница:

Это правда, что есть вставка спецификации. Однако, если бы это было в самом начале тела ответа HTTP (вверху документа), оно не отображалось бы ни в браузере, ни через devtools / в DOM.

Рядом со спецификацией также должен быть по крайней мере один дополнительный символ. И он должен быть расположен перед спецификацией.

Это может быть, например, другой символ спецификации (или какой-либо другой пробел или любой другой символ).

Это важно отметить, когда вы с нетерпением ждете устранения проблемы, так как, скорее всего, ее нет redirect.php (в одиночку), или она должна быть не в самом начале, а где-то там, например, другое требование/включение.

Это может привести к стратегии очистки, которая упорядочивает вещи по-другому:

Сначала исправьте другие файлы, а затем, когда браузер покажет «чистый», исправьте первый файл (таким redirect.php образом, предпоследний, а затем файл, в котором <?php require 'redirect.php' ?> оператор последний).

(только пример, это зависит от конкретных используемых файлов, которых я не знаю. дело в том, что это может показаться чистым случайно)


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


Ответ №3:

Когда я открываю этот образец кода в VSCode и использую DevTools, формат никогда не меняется. Попробуйте заключить необходимый файл в кавычки и круглые скобки, как в примере ниже.

<?php require("redirect.php")?>

Ответ №4:

DevTools показывает интерпретированный код. Вполне возможно, что ваш бесплатный хост вставит в ваш код какую-нибудь рекламу. Посмотрите на свой реальный исходный код с помощью CTRL U в браузере. Это должно показать, что происходит

Комментарии:

1. Это должен быть комментарий, а не ответ, поскольку он просто помогает оператору отладить проблему, но не обязательно ее решать.