我用 python 编写了一个应用程序,一个适用于 Apple 设备的自动 VPN 配置门户网站。
让我烦恼的是测试服务器和生产服务器之间的行为差异;前者是使用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 中都是如此。我通过网络嗅探,发现通过 .NET 对 Content-Type 没有明显的更改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->开发->显示Web检查器->调试器->单击主页->复制为curl仅返回“curl 'https://xxxx/cgi-bin/vpn.py粘贴时“-Xnull”。
我也尝试过禁用X-Frame-Options: "sameorigin"
,但没有什么区别(我知道这是一个不可能的事情)
答案1
看来使用该.htaccess
文件解决了向标头添加 Content-Disposition 的问题。
然而,复制功能的问题以及调试和测试中增加的复杂性——似乎有另一种解释。
出于安全原因,最新的测试版和当前版本的 Sierra 更新文件似乎都.mobileconfig
从 Safari 的“安全”文件打开列表中删除。
我昨天(或前天)在工作时更新了 MacOS,今天在家里更新了,我不再能够.mobileconfig
自动打开生产或预生产系统上的文件。
.mobileconfig
我刚刚将我的 iPhone 更新到了 iOS 10.3.3 beta,这似乎也证实了苹果将配置文件视为潜在危险的倾向。现在,当单击此类文件时,您会看到一个新警告:
该网站正在尝试打开“设置”以向您显示配置文件。您想允许这样做吗?
忽略 - 允许