Eu escrevi um aplicativo, um portal da web de provisionamento VPN automático em python para dispositivos Apple.
O que me incomoda é uma diferença de comportamento entre o servidor de teste e de produção; o primeiro está usando Apache
, enquanto o segundo está usando lighthttpd
.
Em lighhttpd
, o arquivo .mobileconfig
é aberto e "executado", e. ele abre o SysPrefs automaticamente, enquanto no Apache isso não está acontecendo.
Já notei que lighhtpd
é muito mais frouxa em relação às definições adequadas de Content-Type
, mas o problema é que o Safari carregará e "executará automaticamente" .mobileconfig
arquivos corretamente com lighthttpd
, enquanto o mesmo não acontece com Apache
.
O que mais me irrita é que em ambos os servidores eu defini corretamente o mime.type
correspondente como em:
lighthttpd.conf
$HTTP["url"] =~ "\.mobileconfig$" {
setenv.add-response-header = ( "Content-Disposition" => "attachment" )
mimetype.assign = (".mobileconfig" => "application/x-apple-aspen-config",
"" => "application/octet-stream")
}
Como no Apache, é:
dovpn.conf (vhost)
AddType application/x-apple-aspen-config .mobileconfig
A primeira dica de uma diferença, na verdade, parece derivar daquela diretiva add-response-header
em lighthttpd
.
No HTML gerado, tenho:
a download="profile.mobileconfig" href="../upload/8bd16b26-1473-4994-9803-8268a372cd0d.mobileconfig" type="application/octet-stream">Download automatic profile/a
e eu faço um download automático disso via 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;
}
}
O conteúdo da página de geração também tem apenas como Content-Type:
Content-Type: text/html\n\n
tanto no Apache como no lighthttpd. Eu cheirei o fio, e não há mudanças aparentes feitas no Content-Type feitas via lighthttpd
.
Poderei replicar a funcionalidade semelhante de setenv.add-response-header
com o Apache?
Eu já tentei adicionar ao host do Apache:
<Files "*.mobileconfig">
Header set Content-Disposition attachment
</Files>
e
SetEnvIf Request_URI "\.mobileconfig$" change_header
Header set Content-Disposition attachment env=change_header
e
SetEnvIf Request_URI "\.mobileconfig$" change_header
Header always add "Content-Disposition" "attachment" env=change_header
e
<Files "*.mobileconfig">
Header append Content-Disposition attachment
</Files>
Eu também tentei, no diretório atual, criar um arquivo .htaccess
com:
<IfModule mod_headers.c>
<FilesMatch "\.mobileconfig$">
ForceType application/octet-stream
Header append Content-Disposition "attachment"
Allow from all
</FilesMatch>
</IfModule>
e
<IfModule mod_headers.c>
<FilesMatch "\.mobileconfig$">
ForceType application/octet-stream
Header add Content-Disposition "attachment"
Allow from all
</FilesMatch>
</IfModule>
Em ambos os casos, além de attachment
, também usei "attachment"
.
Por favor, note que o mod_headers está ativo por padrão no Apache / Debian 9, e nenhuma dessas alternativas funcionou.
Na verdade, acabei de me lembrar de lighthttpd
está usando HTTP e Apache
HTTPS. Eu testei o lighthttpd com HTTPS, e ele também funciona em HTTPS, enquanto o Apache não funciona.
Saída de curl -k -I https://localhost/cgi-bin/vpn.py
no servidor 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
Saída de curl -k -I https://localhost/cgi-bin/vpn.py
no servidor 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
Além disso, no Apache também:
$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
Usando o Safari - > Desenvolvimento > Mostrar o Inspetor da web > Depurador - > clicando na página principal > Copiar como enrolar só me retorna "enrolar" link '-Xnull" ao colar.
Eu também tentei desabilitar X-Frame-Options: "sameorigin"
e não fez diferença (eu sabia que era um tiro longo)