我們家的設計在某個案件中遇到了奇怪的情況,設計好內嵌 Flash 的 html 頁面,在本機瀏覽一切正常,但上傳到某台測試的 IIS 主機上卻一直吐伺服器 500 錯誤出來。
我連進主機查看,錯誤訊息如下:
Active Server Pages 錯誤 ‘ASP 0139’
巢狀式物件
/test.html, 行23
物件標記無法放在另一個物件標記內。
實在相當詭異,不是單純的 html 檔案嗎?為什麼會引發 ASP 錯誤呢?
開啟該檔案查看,錯誤的那行是 object 標籤,看起來是 Dreamweaver 插入 SWF 物件產生的 object 語法。
該段語法是這樣的:
[code language=”html”]
<object id="FlashID2" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="596" align="middle">
<param name="movie" value="test.swf" />
<param name="quality" value="high" />
<param name="wmode" value="transparent" />
<param name="swfversion" value="8.0.35.0" />
<!– 此 param 標籤會提示使用 Flash Player 6.0 r65 和更新版本的使用者下載最新版本的 Flash Player。如果您不想讓使用者看到這項提示,請將其刪除。 –>
<param name="expressinstall" value="../Scripts/expressInstall.swf" />
<!– 下一個物件標籤僅供非 IE 瀏覽器使用。因此,請使用 IECC 將其自 IE 隱藏。 –>
<!–[if !IE]>–>
<object id="FlashID2" type="application/x-shockwave-flash" data="test.swf" width="1003" height="580">
<!–<![endif]–>
<param name="quality" value="high" />
<param name="wmode" value="transparent" />
<param name="swfversion" value="8.0.35.0" />
<param name="expressinstall" value="../Scripts/expressInstall.swf" />
<!– 瀏覽器會為使用 Flash Player 6.0 和更早版本的使用者顯示下列替代內容。 –>
<div>
<h4>這個頁面上的內容需要較新版本的 Adobe Flash Player。</h4>
<p><a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="取得 Adobe Flash Player" width="112" height="33" /></a></p>
</div>
<!–[if !IE]>–>
</object>
<!–<![endif]–>
</object>
[/code]
上網查了一下相關資料,似乎是巢狀 object 標籤造成 ASP 這邊引發錯誤。
而這台的 IIS 7.5 似乎將 *.html 以 asp.dll 解析執行,因此 .html 會引發 ASP 的錯誤訊息 …
相關的解法是這樣,來自 swfobject 的 FAQ:
http://code.google.com/p/swfobject/wiki/faq
粗略地翻譯如下:
二三點都有相關網頁輔以參考,這邊就來說明一下第一點 – 設定 IIS 的作法。
1. 打開 IIS (這邊以 IIS 7.5 為例),進入欲設定的應用程式,找到「處理常式對應」:
2. 找到其中的 HTML,應該可以看到它是以 asp.dll 解析,我們將這行刪除。
OK,這樣 ASP 0139 錯誤應該就能被解決了。
這似乎不是很好的解法,因為只解決了 *.html 的檔案類型,萬一真是 *.asp 中包含這種巢狀 object 標籤怎麼辦呢?
經過測試,似乎新版本的 swfobject 2.2 就不會產生這種巢狀標籤,以這種方式來嵌入 swf 檔案就沒有問題了。
相當奇怪的問題呢,特此筆記一下。
2013/01/02 更新:
由於有設計師朋友遇到相同問題,透過 IIS 設定的解法太困難了,故在此也做一個改 Code 的做法紀錄:(一樣參考這邊)
請把原本巢狀的 object 加上 <%%> 即可。
例如原本是這樣:
[code language=”html”]
<object id="FlashID2" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="596" align="middle">
<param name="movie" value="test.swf" />
<param name="quality" value="high" />
<param name="wmode" value="transparent" />
<param name="swfversion" value="8.0.35.0" />
<!– 此 param 標籤會提示使用 Flash Player 6.0 r65 和更新版本的使用者下載最新版本的 Flash Player。如果您不想讓使用者看到這項提示,請將其刪除。 –>
<param name="expressinstall" value="../Scripts/expressInstall.swf" />
<!– 下一個物件標籤僅供非 IE 瀏覽器使用。因此,請使用 IECC 將其自 IE 隱藏。 –>
<!–[if !IE]>–>
<object id="FlashID2" type="application/x-shockwave-flash" data="test.swf" width="1003" height="580">
<!–<![endif]–>
<param name="quality" value="high" />
<param name="wmode" value="transparent" />
<param name="swfversion" value="8.0.35.0" />
<param name="expressinstall" value="../Scripts/expressInstall.swf" />
<!– 瀏覽器會為使用 Flash Player 6.0 和更早版本的使用者顯示下列替代內容。 –>
<div>
<h4>這個頁面上的內容需要較新版本的 Adobe Flash Player。</h4>
<p><a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="取得 Adobe Flash Player" width="112" height="33" /></a></p>
</div>
<!–[if !IE]>–>
</object>
<!–<![endif]–>
</object>
[/code]
我們可以把每個 <object 標籤前面改成 <<%%>object,
也就是這樣:
[code language=”html”]
<<%%>object id="FlashID2" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="596" align="middle">
<param name="movie" value="test.swf" />
<param name="quality" value="high" />
<param name="wmode" value="transparent" />
<param name="swfversion" value="8.0.35.0" />
<!– 此 param 標籤會提示使用 Flash Player 6.0 r65 和更新版本的使用者下載最新版本的 Flash Player。如果您不想讓使用者看到這項提示,請將其刪除。 –>
<param name="expressinstall" value="../Scripts/expressInstall.swf" />
<!– 下一個物件標籤僅供非 IE 瀏覽器使用。因此,請使用 IECC 將其自 IE 隱藏。 –>
<!–[if !IE]>–>
<<%%>object id="FlashID2" type="application/x-shockwave-flash" data="test.swf" width="1003" height="580">
<!–<![endif]–>
<param name="quality" value="high" />
<param name="wmode" value="transparent" />
<param name="swfversion" value="8.0.35.0" />
<param name="expressinstall" value="../Scripts/expressInstall.swf" />
<!– 瀏覽器會為使用 Flash Player 6.0 和更早版本的使用者顯示下列替代內容。 –>
<div>
<h4>這個頁面上的內容需要較新版本的 Adobe Flash Player。</h4>
<p><a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="取得 Adobe Flash Player" width="112" height="33" /></a></p>
</div>
<!–[if !IE]>–>
</object>
<!–<![endif]–>
</object>
[/code]
就可以解掉了。