Apache vs lighthttpd:mime 類型的不同行為
我已經為 Apple 設備編寫了一個應用程序,一個使用 python 的自動 VPN 配置 Web 門戶。
讓我感到困擾的是測試伺服器和生產伺服器之間的行為差異;前者正在使用
Apache
,而後者正在使用lighthttpd
。在文件
lighhttpd
中.mobileconfig
打開並“執行”例如它會自動打開 SysPrefs,而在 Apache 中則不會發生。我已經註意到
lighhtpd
關於正確定義要寬鬆得多Content-Type
,但是手頭的問題是 Safari 將.mobileconfig
正確載入和“自動執行”文件,lighthttpd
而Apache
.更讓我惱火的是,在兩台伺服器中,我都正確定義了相應的伺服器,如下所示
mime.type
:lighthttpd.conf
$HTTP["url"] =~ "\.mobileconfig$" { setenv.add-response-header = ( "Content-Disposition" => "attachment" ) mimetype.assign = (".mobileconfig" => "application/x-apple-aspen-config", "" => "application/octet-stream") }
就像在 Apache 中一樣:
dovpn.conf (虛擬主機)
AddType application/x-apple-aspen-config .mobileconfig
差異的第一個線索實際上似乎
add-response-header
源於lighthttpd
.在生成的 HTML 中,我有:
a download="profile.mobileconfig" href="../upload/8bd16b26-1473-4994-9803-8268a372cd0d.mobileconfig" type="application/octet-stream">Download automatic profile/a
我通過 Javascript 自動下載
//If in Safari - download via virtual link click if (window.downloadFile.isSafari) { //Creating new link node. var link = document.createElement('a'); link.href = sUrl; if (link.download !== undefined) { //Set HTML5 download attribute. This will prevent file from opening if supported. var fileName = sUrl.substring(sUrl.lastIndexOf('/') + 1, sUrl.length); link.download = fileName; } //Dispatching click event. if (document.createEvent) { var e = document.createEvent('MouseEvents'); e.initEvent('click', true, true); link.dispatchEvent(e); return true; } }
生成頁面的內容也只有 Content-Type:
Content-Type: text/html\n\n
在 Apache 和 lighthttpd 中。我嗅了嗅電線,並沒有對通過
lighthttpd
.我能否複製
setenv.add-response-header
與 Apache 類似的功能?我已經嘗試添加到 Apache 主機:
<Files "*.mobileconfig"> Header set Content-Disposition attachment </Files>
和
SetEnvIf Request_URI "\.mobileconfig$" change_header Header set Content-Disposition attachment env=change_header
和
SetEnvIf Request_URI "\.mobileconfig$" change_header Header always add "Content-Disposition" "attachment" env=change_header
和
<Files "*.mobileconfig"> Header append Content-Disposition attachment </Files>
我還嘗試在實際目錄中創建一個
.htaccess
文件:<IfModule mod_headers.c> <FilesMatch "\.mobileconfig$"> ForceType application/octet-stream Header append Content-Disposition "attachment" Allow from all </FilesMatch> </IfModule>
和
<IfModule mod_headers.c> <FilesMatch "\.mobileconfig$"> ForceType application/octet-stream Header add Content-Disposition "attachment" Allow from all </FilesMatch> </IfModule>
在這兩種情況下,除此之外
attachment
,我還使用了"attachment"
.請注意 mod_headers 在 Apache/Debian 9 中預設處於活動狀態,並且這些替代方案都沒有成功。
實際上,我只記得
lighthttpd
使用 HTTP 和Apache
HTTPS。我用 HTTPS 測試了 lighthttpd,它也可以通過 HTTPS 工作,而 Apache 不能。
curl -k -I https://localhost/cgi-bin/vpn.py
在 lighthttpd 伺服器中的輸出:HTTP/1.1 200 OK Content type: text/html Content-Length: 331 Date: Thu, 01 Jun 2017 09:03:26 GMT Server: lighttpd/1.4.45
curl -k -I https://localhost/cgi-bin/vpn.py
在 Apache 伺服器中的輸出:HTTP/1.1 200 OK Date: Thu, 01 Jun 2017 09:05:25 GMT Server: Apache Vary: Accept-Encoding X-Frame-Options: sameorigin Content-Type: text/html; charset=UTF-8
此外,在 Apache 中:
$curl -k -I https://localhost/download/xxx.mobileconfig HTTP/1.1 200 OK Date: Thu, 01 Jun 2017 09:13:35 GMT Server: Apache Last-Modified: Thu, 01 Jun 2017 03:08:57 GMT ETag: "1f3b-550dd5b89d8df" Accept-Ranges: bytes Content-Length: 7995 X-Frame-Options: sameorigin Content-Disposition: attachment Content-Type: application/x-apple-aspen-config
使用 Safari->Develop->Show web Inspector->Debugger->clicking on main page->Copy as curl 粘貼時只返回“curl ’ https://xxxx/cgi-bin/vpn.py ’ -Xnull”。
我也嘗試禁用
X-Frame-Options: "sameorigin"
它並沒有任何區別(我知道這是一個很長的鏡頭)
似乎使用該
.htaccess
文件解決了將 Content-Disposition 添加到標題的問題。然而,複製功能的問題以及調試和測試中增加的複雜性——似乎有另一種解釋。
.mobileconfig
出於安全原因,似乎在最新測試版和目前版本的 Sierra 更新文件中都已從 Safari 的“安全”文件列表中刪除。我昨天(或前天)在工作中更新了 MacOS,今天在家裡,我再也無法讓
.mobileconfig
生產或預生產系統上的文件自動打開。我剛剛將我的 iPhone 更新到 iOS 10.3.3 beta,這似乎也證實了 Apple 將
.mobileconfig
配置文件視為潛在危險的趨勢。現在,當點擊此類文件時,您會看到一個新警告:該網站正在嘗試打開“設置”以向您顯示配置文件。你想允許這個嗎?
忽略 - 允許