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

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

В результате мой HTML в DevTools выглядит так: изображение кода в 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» не имеет значения, потому что даже если я опустошу этот файл, я получаю такое же странное поведение. Я проверил наличие невидимых символов Юникода, которые каким-то образом вошли в мой код; нет ни одного.

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

Если это поможет, я использую хостинг InfinityFree.

1
goldenbanana42 4 Июл 2021 в 18:34

4 ответа

Лучший ответ

&#xFEFF; - это метка порядка байтов.

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

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

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

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


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

1
Quentin 4 Июл 2021 в 15:41

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

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

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

Вот различие:

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

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

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

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

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

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

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


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


1
hakre 4 Июл 2021 в 16:47

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

<?php require**(**'redirect.php'**)**?>

Также убедитесь, что нужный файл находится в том же каталоге.

-1
erica codes 4 Июл 2021 в 16:10

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

-2
Brain Foo Long 4 Июл 2021 в 15:38