Проблема с пробелами перед doctype

У меня есть странная проблема, когда у меня есть 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) никакие пробелы или другие символы не могут отправлять клиенту перед этими функциями.