#php #html
Вопрос:
Я внедрил систему проверки для своего веб-сайта, где каждый раз, когда пользователь запрашивает страницу, запускается PHP-скрипт, который проверяет, вошел ли пользователь в систему в данный момент. Если нет, то пользователь перенаправляется на страницу входа в систему. Это делается с помощью одного «redirect.php» файл, который «требуется» для каждой страницы, используя синтаксис <?php require 'redirect.php' ?>
.
На каждой странице, содержащей приведенное выше утверждение, весь код в <head>
элементе удален и помещен в начало <body>
. Кроме того, сущность HTML вставляется в кавычки: "amp;#xFEFF; "
.
В результате в DevTools мой HTML выглядит следующим образом:
В то время как в моем редакторе это выглядит так:
<?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. Это должен быть комментарий, а не ответ, поскольку он просто помогает оператору отладить проблему, но не обязательно ее решать.