Op mijn nieuw iPhone schakelde ik de belangrijkste functies voor zakelijk gebruik in: email (IMAP), en het synchroniseren van contacten en agenda. Deze diensten worden geleverd door servers in eigen beheer.
Voor het synchroniseren van contacten gebruik ik het CardDAV-protocol. Voor de agenda is een vergelijkbaar protocol dat CalDAV heet. Baïkal is de software waarmee dit op de server wordt gefaciliteerd, via webserver Nginx. De recente versies van iOS ondersteunen zowel IMAP, CardDAV als CalDAV. Mijn laptop synchroniseert de gegevens ook met deze server, met gebruikmaking van dezelfde protocollen.
Email en contacten waren snel geregeld op de iPhone. Synchronisatie van de agenda werkte niet meteen. Daarom maar even op onderzoek uit.
Zoeken op internet naar de combinatie van iOS en Baïkal levert een aantal specifieke probleemmeldingen op. Om een verder goed werkende Baïkal-service op iOS werkend te maken, moet in de webserver een aanpassing worden gemaakt. Bij het leggen van contact met de Baïkal-server gebruikt iOS een standaard pad, iets in de vorm van https://my.server.com/baikal/.well-known/caldav. Hiervoor moet een redirect-regel worden opgegeven in de webserver, die er voor zorgt dat het verzoek van de iPhone doorverwezen wordt naar het juiste adres.
De meeste documentatie van Baïkal gaat niet uit van Nginx als webserver. Los daarvan wordt in de voorgestelde oplossingen niet altijd duidelijk waar deze redirect-regels moeten worden doorgevoerd. Opties:
- In de root-folder van de website van de Nginx-server zou een directory .well-known moeten bestaan, met daarin een bestand genaamd .htaccess waarin de (Nginx-specifieke) redirect-regels moeten worden opgenomen. Dit bleek niet voldoende om een redirect te forceren.
- In de basis-configuratie van Nginx-server. Deze instelling zorgt dat het verzoek van de iPhone naar de goede url wordt doorverwezen.
Voorbeeld van redirect-regels voor Nginx in het .htaccess bestand:
rewrite ^/.well-known/carddav$ /card.php;
rewrite ^/.well-known/caldav$ /cal.php;
Voorbeeld van redirect-rules in de server-sectie in bestand /etc/nginx/nginx.conf:
server { listen 443; server_name my.server.com; root /var/www/baikal/html; index index.php; rewrite ^/.well-known/caldav /dav.php redirect; rewrite ^/.well-known/carddav /dav.php redirect; charset utf-8;
Na het doorvoeren van deze wijzing synchroniseerde de agenda nog steeds niet. Bij het invoeren van het adres van de Baïkal-server controleert iOS een paar zaken, en concludeert dat er geen agenda te bereiken is. In de Nginx access logs zijn op dat moment de binnenkomende verzoeken te zien, waarvan de laatste eindigen in http error 405 (method not allowed).
iOS stelt veel verschillende vragen aan de CalDAV-server, waarvan Baïkal niet alles lijkt te ondersteunen. Dergelijke foutmeldingen zijn dus niet helemaal te voorkomen, ook als synchronisatie wel werkt. Vanaf de iPhone kon de agenda echter nog niet worden gesynchroniseerd.
Het viel me op dat het opzetten van synchronisatie voor contacten via CardDAV geen enkel probleem had opgeleverd op de iPhone. Een analyse:
- De url die de Baïkal-server verwacht voor de contacten is standaard https://my.server.com/baikal/card.php/addressbooks/erwin/default/
- In iOS was er dit van gemaakt (werkend): https://my.server.com/baikal/card.php/principals/erwin
- Bij het opzetten van synchronisatie van de agenda verwacht iOS: https://my.server.com, en stelt de vraag vervolgens aan https://my.server.com/baikal/.well-known/caldav.
- Dit leidt tot redirect naar https://my.server.com/baikal/cal.php/addressbooks/erwin/default/ en tot foutmeldingen.
- Daarom heb ik het volgende als adres ingegeven bij de iOS-agenda: https://my.server.com/baikal/cal.php/principals/erwin. Dit werkt.
Dus, voor synchronisatie van contacten en agenda op iOS met een Baïkal-server op Nginx:
- De redirect-regels (voor iOS) moeten in orde zijn op Nginx, dus in de basisconfiguratie van Nginx.
- De url’s die in iOS moeten worden ingegeven voor de Baïkal-diensten wijken af van wat gebruikelijk is met andere Baïkal-clients.