Я пытаюсь настроить службу автообнаружения с помощью метода перенаправления HTTP 302, который перенаправляет на домен, который правильно обеспечивает автообнаружение. xml через HTTPS. При такой конфигурации параметры автообнаружения POP / IMAP / SMTP и EAS корректно предоставляются на iPhone и Android, поэтому я считаю, что служба настроена правильно, а полезная нагрузка XML правильная. Кроме того, https://testconnectivity.microsoft.com/ дает положительные результаты как в Outlook Autodiscover ed. Exchange ActiveSyn c Autodiscover.
Проблема возникает только в Outlook для Office 365 и Windows App Mail (включено windows 10). В обоих случаях после заполнения адреса электронной почты в регистрационной форме запрос к автообнаружению проходит нормально (я добавил распечатку сгенерированного XML и это правильно). Однако есть второй экран, где предлагается ввести пароль, и здесь возникает проблема. В основном, новый запрос GET (/AutoDiscover/AutoDiscover.xml) отправляется исходному домену (через HTTP), но перенаправление 302 в этом случае не происходит, и появляется новое окно, сообщающее, что параметры не найдены. Это похоже на второй вызов после ввода пароля, который ожидает ответа, отличного от перенаправления 302.
Чтобы лучше описать мою конфигурацию:
- адрес электронной почты, для которого я запрашиваю автообнаружение: user@domain1.com
- конфигурация DNS: autodiscover.domain1.com CNAME для autodiscover.domain2.com
- autodiscover.domain1.com (IP-адрес autodiscover.domain2.com через CNAME в DNS) отвечает только на ответы через HTTP и выполняет перенаправление 302 на https://autodiscover.domain2.com/AutoDiscover/AutoDiscover.xml (без учета регистра)
- autodiscover.domain2.com имеет правило Apache, поэтому файл AutoDiscover. xml (без учета регистра) ) генерируется сценарием PHP, который анализирует содержание запроса и отвечает с правильным XML для EAS или Outlook на основе содержимого запроса.
Я также пытался установить запись SRV указывает на autodiscover.domain2.com, но результат тот же.
Я вполне уверен, что полезная нагрузка XML верна, потому что на Android и iPhone EAS настроен как Я настроен нормально, только с Outlook и App Mail мне не удается заставить его работать.
Любая помощь приветствуется!
Это конфигурация виртуального хоста:
<VirtualHost *:80>
ServerName autodiscover.domain2.com
ServerAlias autodiscover.*
ServerAlias autoconfig.*
DocumentRoot /var/www/autodiscover.domain2.com/public_html
ErrorLog /var/log/autodiscover.domain2.com_error_log
CustomLog /var/log/autodiscover.domain2.com_access_log combined
</VirtualHost>
<VirtualHost *:443>
ServerName atodiscover.domain2.com
ServerAlias autoconfig.domain2.com
DocumentRoot /var/www/autodiscover.domain2.com/public_html
ErrorLog /var/log/autodiscover.domain2.com_error_log
CustomLog /var/log/autodiscover.domain2.com_access_log combined
ScriptAlias /AutoDiscover/AutoDiscover.xml /var/www/autodiscover.domain2.com/public_html/outlook.php
ScriptAlias /Autodiscover/Autodiscover.xml /var/www/autodiscover.domain2.com/public_html/outlook.php
ScriptAlias /autodiscover/autodiscover.xml /var/www/autodiscover.domain2.com/public_html/outlook.php
SSLEngine on
SSLCertificateFile /path/to/ssl.cert
SSLCertificateKeyFile /path/to/ssl.key
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
</VirtualHost>
это .htaccess:
RewriteEngine On
# thunderbird
RewriteRule ^.*config-v1\.1\.xml$ https://autodiscover.domain2.com/thunderbird.php [NC,L]
# redirect autodiscover.xml to https of domain2 (302)
RewriteCond %{HTTPS} off
RewriteRule ^.*autodiscover\.xml$ https://autodiscover.domain2.com%{REQUEST_URI} [NC,L,R=302]
# redirect autodiscover.xml to outlook.php
RewriteCond %{HTTP_HOST} ^autodiscover\.domain2\.com$ [NC]
RewriteRule ^.*autodiscover\.xml$ https://autodiscover.domain2.com/outlook.php [NC,L]
# redirect autodiscover.json to outlook.json.php
RewriteCond %{HTTP_HOST} ^autodiscover\.domain2\.com$ [NC]
RewriteRule ^.*autodiscover\.json$ https://autodiscover.domain2.com/outlook.json.php [NC,L]
это внешний вид. php скрипт помещен в / var / www/html/autodiscover.domain2.com/public_html/:
<?php
header("Content-Type: application/xml");
$data = file_get_contents("php://input");
preg_match("/\<EMailAddress\>(.*?)\<\/EMailAddress\>/", $data, $matches);
if($matches == false || count($matches)!=2) exit(0);
$ar = explode('@' ,$matches[1]);
if(count($ar)!=2) exit(0);
$account = $ar[0];
$domain = $ar[1];
$email = $matches[1];
$provider = 'domain2.com';
$buf = '';
if(preg_match('/mobilesync/',$data))
{
$buf = '<?xml version="1.0" encoding="utf-8" ?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
<Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/mobilesync/responseschema/2006">
<Culture>en:us</Culture>
<User>
<DisplayName>'.$email.'</DisplayName>
<EMailAddress>'.$email.'</EMailAddress>
</User>
<Action>
<Settings>
<Server>
<Type>MobileSync</Type>
<Url>https://eas.domain2.com/Microsoft-Server-ActiveSync</Url>
<Name>https://eas.domain2.com/Microsoft-Server-ActiveSync</Name>
</Server>
</Settings>
</Action>
</Response>
</Autodiscover>';
}
else
{
$buf = '<?xml version="1.0" encoding="utf-8" ?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
<Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
<User>
<DisplayName>'.$email.'</DisplayName>
</User>
<Account>
<AccountType>email</AccountType>
<Action>settings</Action>
<Protocol>
<Type>POP3</Type>
<Server>pop.'.$provider.'</Server>
<Port>995</Port>
<LoginName>'.$email.'</LoginName>
<DomainRequired>off</DomainRequired>
<SPA>off</SPA>
<SSL>on</SSL>
<AuthRequired>on</AuthRequired>
<DomainRequired>off</DomainRequired>
</Protocol>
<Protocol>
<Type>IMAP</Type>
<Server>imap.'.$provider.'</Server>
<Port>993</Port>
<DomainRequired>off</DomainRequired>
<LoginName>'.$email.'</LoginName>
<SPA>off</SPA>
<SSL>on</SSL>
<AuthRequired>on</AuthRequired>
</Protocol>
<Protocol>
<Type>SMTP</Type>
<Server>smtp.'.$provider.'</Server>
<Port>465</Port>
<DomainRequired>off</DomainRequired>
<LoginName>'.$email.'</LoginName>
<SPA>off</SPA>
<Encryption>SSL</Encryption>
<AuthRequired>on</AuthRequired>
<UsePOPAuth>off</UsePOPAuth>
<SMTPLast>off</SMTPLast>
</Protocol>
</Account>
</Response>
</Autodiscover>';
}
echo $buf;
это внешний вид. json. php:
<?php
$url = 'https://eas.domain2.com/Microsoft-Server-ActiveSync';
header('Content-type: application/json');
if (strtolower($_GET['Protocol']) == 'activesync') {
echo '{"Protocol":"ActiveSync","Url":"' . $url . '"}';
}
elseif (strtolower($_GET['Protocol']) == 'autodiscoverv1') {
echo '{"Protocol":"AutodiscoverV1","Url":"https://' . $_SERVER['HTTP_HOST'] . '/Autodiscover/Autodiscover.xml"}';
}
else {
http_response_code(400);
echo '{"ErrorCode":"InvalidProtocol","ErrorMessage":"The given protocol value \u0027' . $_GET['Protocol'] . '\u0027 is invalid. Supported values are \u0027ActiveSync,AutodiscoverV1\u0027"}';
}