2011-01-20 50 views
4

我得到了一些奇怪的問題,我有2個不同的文件夾中的同一網站的副本。在這兩個副本中的一個在doctype聲明之前有空格,所以我有問題與facebook一起工作,因爲文檔格式不正確。doctype之前的空白問題

在html之前有一些php計算,但是沒有echo語句或者其他東西。

在同一臺服務器上的不同文件夾下有兩個標識網站可能導致什麼原因?

+0

是php和服務器版本一樣嗎? – simon 2011-01-20 15:31:25

+0

也許這是Facebook嘲笑的[UTF BOM](http://en.wikipedia.org/wiki/Byte_order_mark)。 – Gumbo 2011-01-20 15:39:29

+1

@Gumbo,剛檢查過的文件是沒有BOM的UNIX/UTF-8。 – arma 2011-01-20 15:41:11

回答

8

我幾乎肯定地確定你在PHP include結尾處有一些尾隨的空白。首先在那裏檢查。

例子:

<?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 

我加了注,以最終獲得計算器的降價編輯器來展示收盤?>標籤後,其他行。包含標籤後PHP會自動截斷一個換行符,但如果您有多個換行符,則在您的文檔類型聲明之前它們將被解釋爲空格。

最簡單的修復?從所有包含中刪除結束標記?>。這是a valid technique,並且可能是您啓動和運行的最快方式。

+0

好的,謝謝我現在嘗試執行此操作,但我有很多課程和其他內容需要處理。我會回來的結果。 – arma 2011-01-20 15:54:44

0

如果您使用的是include,這尤其常見。仔細檢查您的輸出或標題之前的所有包含或其他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),但在我的開發機器上(最新的Fedora)它不會發生,我也沒有問題。

老實說,有可能是我可以跟蹤找出原因,但由於正確的用法說「沒有額外的空間或行」我只是這樣做,不要太擔心「爲什麼我的處理方式不同服務器「就是這麼多。 (我知道的一種cop-out)

+0

事情是,我在相同的條件下運行這兩個網站(例如:相同的服務器,相同的MySQL等)只是不同的文件夾名稱。 – arma 2011-01-20 15:38:22

+0

這很有趣,但這仍然是我期待的第一件事。 – 2011-01-20 15:41:20

-1

你是否在任何地方使用session_start()或header()?然後(沒有outbutbuffering)沒有空白或其他字符被允許發送到客戶端之前,此功能。

1

你不會說你遇到問題的瀏覽器。 IE用來檢查頁面的前幾個字母的doctype,如果它不是一個(如空白),它會進入怪癖模式。

0

你可能不相信,但我有解決這個問題的一個魔道:

使用的cPanel的文件管理器上傳您的文件(這<!DOCTYPE之前包括)您的主機上,然後選擇文件並點擊「編輯「查看文檔的源代碼。 然後按Ctrl + 首頁然後按刪除

你看到沒有東西會被刪除,但隱藏的白色空間! 保存您的文檔,您會注意到現在一切正常。

我這樣做我所有的項目

0

在我的情況下能正常工作:

$ 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 
0

我跑到這個地方換行是文檔類型以上。我嘗試了幾件事,然後最終放在PHP中的文檔類型。

<?php 
echo '<!DOCTYPE html>'; 
... other php code/includes/etc ... 
?> 
<html> 
... other html elements ... 

不知道如果這是正確的方式去了解它,但它爲我工作。如果您使用更廣泛的文檔類型,則需要轉義特殊字符。

0

我剛剛花了一天的時間解決了這個問題,其中我的庫在靜態頁面上工作正常,但是在開始時使用主腳本的動態系統下(apache mod_write將所有腳本重寫爲主腳本)瀏覽器翻轉爲向後兼容模式(js :alert(document.compatMode()))並扭曲了我的樣式。我所有的包含文件都正常結束,沒有回聲等。問題是什麼?上面的空行開頭<?php的主腳本.......