У меня есть странная проблема, когда у меня есть 2 копии одного и того же сайта в двух разных папках. В одном из этих двух экземпляров есть пробелы перед декларацией doctype, поэтому у меня возникают проблемы с работой с facebook, поскольку документ формируется неправильно.
Перед html есть некоторые вычисления php, но нет эхо-заявлений или чего-то еще.
Что может быть причиной для 2-х идентичных сайтов под одним и тем же сервером в разных папках, у кого есть эта проблема?
Я почти уверен, что у вас есть некоторые конечные пробелы в конце PHP. Проверьте их первым.
Пример:
<?php // header file include 'other_file.php'; ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!-- etc. -->
затем
<?php // other_file.php // connects to database, or something, // but notice the whitespace after the closing tag ?> ... pretend this text isn't here
Я добавил примечание в конце, чтобы получить редактор разметки stackoverflow, чтобы показать дополнительные строки после закрывающего тега ?>
. PHP автоматически обрезает один символ новой строки после включения тега, но если у вас более одного, они будут интерпретироваться как пустое место перед объявлением doctype.
Легко исправить? Удалите закрывающий тег ?>
Из всех ваших включений. Это эффективный метод и может быть самым быстрым способом для вас встать и работать.
Вы не говорите, с каким браузером у вас возникают проблемы. IE используется для проверки первых нескольких букв страницы для doctype и, если это не один (например, пробел), он переходит в режим quirks.
Это особенно характерно, если вы используете. Проверяйте все свои включенные или другие php-файлы, которые должны быть представлены перед вашим выходом или заголовками.
<? echo "php here"; ?> This will cause a problem if it's in an includes that comes before your headers or doctypes. Remove any non php here, file should end with "?>" not whitespace, linefeeds or characters.
А почему? Неизвестно, что на одном производственном сервере эта проблема постоянно поднимает голову для меня (CentOs 5), но на моей машине dev (последняя версия Fedora) этого не происходит, и у меня нет проблем.
Честно говоря, есть кое-что, что я мог бы найти, чтобы узнать, почему, но поскольку правильное использование говорит «никаких лишних пробелов или строк», я просто делаю это и не слишком беспокоиться о том, «почему это происходит по-разному на моих серверах». много. (Вид мне, который я знаю)
Я столкнулся с этим, когда разрыв линии был выше Doctype. Я попробовал несколько вещей, а затем просто разместил doctype в php.
<?php echo '<!DOCTYPE html>'; ... other php code/includes/etc ... ?> <html> ... other html elements ...
Не уверен, что это правильный путь, но это сработало для меня. Если вы используете более обширный тип doctype, вам нужно избежать специальных символов.
Я просто провел день, решив эту проблему, когда мои библиотеки отлично работали на статических страницах, но в динамической системе с главным скриптом в начале (apache mod_write переписывает все в мастер-скрипт) браузер перевернулся в режим обратной совместимости (js: alert (document .compatMode ())) и исказил мой стиль. Все мои включенные файлы были закончены правильно, а не эхо и т. Д. Проблема? Пустая строка над открытием <? Php мастер-скрипта …….
Вы можете не верить, но у меня есть ВОЛШЕБНЫЙ способ решить эту проблему:
Загрузите свои документы (которые были включены до <!DOCTYPE
) на вашем хосте с помощью диспетчера файлов CPanel, затем выберите документ и нажмите «Изменить», чтобы увидеть исходный код документа. Затем нажмите Ctrl + Home, затем нажмите « Удалить» !
Вы видите, что ничего не будет удалено, но это скрытое пустое пространство! Сохраните документ, и вы заметите, что сейчас все в порядке.
Я делаю это для всех своих проектов
В моем случае это прекрасно работает:
$ brew update $ brew install coreutils $ cd directoryWithSymfony2Project $ for file in $(find ./ -name '*.twig' -or -name '*.php'); do sed `echo -e 's/[\xC2\xA0]//g'` $file > temp; echo 'Processing ' $file;rm $file; mv temp $file; done
вы используете session_start () или header () где угодно? то (без outbutbuffering) никакие пробелы или другие символы не могут отправлять клиенту перед этими функциями.