圖像和 AJAX 未在 mod_proxy_html 打開時載入
我們公司目前正在支持一個(非常舊的)支持網路的數據庫應用程序,該應用程序是用 4th Dimension (2003) 編寫的,帶有一個內置的網路伺服器(由名為 Web Server 4D 的擴展程序提供)。由於 Web 伺服器不支持 SSL,我們的客戶端設置 Apache 來處理外部 HTTPS 連接(通過 a
<VirtualHost>
)並通過 HTTP 將所有流量路由到 WS4D 伺服器,使用mod_proxy
. 路由工作正常。問題是 WS4D 伺服器在建構頁面時經常會列印出損壞的 URL。由於 WS4D 伺服器不了解 Apache,因此無論何時列印出完整的 URL(包括域),它都會在 URL 中列印出內部域名和埠號,而不是外部的(例如http://localhost:9999/ home而不是https://www.example.com/home)。大多數其他連結都是相對的(例如/img/smiley.png),因此可以正常工作。
為了解決這個問題,我們嘗試設置一個名為的第三方 Apache 模組
mod_proxy_html
來用正確的域重寫連結。然而,每當我們只啟動 httpd.conf 中的模組(使用ProxyHTMLEnable On
,但沒有定義重寫規則)時,突然我們的 PNG 和 AJAX 請求(以前可以工作)無法載入!我不確定,但我認為伺服器可能會使用錯誤的 MIME 類型返回這些內容。有誰知道我們如何修復/調試這個問題?
**更新:**我檢查了 PNG 的連結,因為它們是相對連結(例如 /img/smiley.png),它們列印得很好。然而,當我將 URL 放入瀏覽器時,我得到了一堆亂碼(我認為這是格式化為文本的二進製圖像)。而且,奇怪的是,一開始就有三個 HTML 標籤:
<html><body><p>
.**更新 2:**我的瀏覽器(Safari)肯定*沒有添加標籤。*當我關閉時
mod_proxy_html
,圖像正常載入到頁面中,但當我直接訪問 URL 時仍以文本形式打開。mod_proxy_html
關閉後,圖像源中的標籤<html><body><p>
會消失。
這是一個 MIME 類型的問題。WS4D 伺服器使用
Content-Type
oftext/html
而不是將所有 PNG 傳輸到 Apacheimage/png
,這導致mod_proxy_html
將它們解釋為 HTML 文件並解析它們。顯然,mod_proxy_html
通過在文件開頭添加任何缺失的標籤以符合 HTML 規範(可能是 using 的副作用libxml2
)來自動嘗試更正不正確的 HTML。每當我們啟用該模組時,它都會不斷添加<html><body><p>
到我們所有 PNG 文件的開頭,這導致瀏覽器阻塞而不顯示它們。更正 MIME 類型完全解決了問題。我們從來沒有發現我們的 AJAX 失敗的確切原因,因為一旦我們修復了 PNG,它就又開始工作了。我們的 AJAX 程式碼通常通過 Apache 從 WS4D 伺服器載入 HTML 片段。在我們修復 PNG 之前,它會顯示一條錯誤消息,通常只在 AJAX 請求返回錯誤程式碼時顯示。我們的理論是 HTML 片段中損壞的 PNG 以某種方式產生了錯誤,但我們無法驗證這一點。
**要點:**如果您打算使用
mod_proxy_html
,請仔細檢查您的 MIME 類型!