<div dir="ltr"><div><div><div>gentile lista,<br></div>vorrei condividere con voi tutti e tutte gioie e dolori di alcune ore dedicate alla pubblicazione con Apache + Mapserver di un servizio WFS, testato poi con qGis.<br><br></div>gioie perchè è bello lavorare con questi strumenti validissimi (e questo non c'è neanche bisogno di dirlo), dolori perchè in qua e la trovo degli "intoppi" che alla fine di questa storia sarete voi a dirmi se ci sono gli "estremi" per segnalarli in modo ufficiale.<br><br><br></div><div>il mio obbiettivo è quello di pubblicare in modo "elegante" con Mapserver un servizio WFS con un end point che non contenga il classico percorso al .map, tipo <br>/cgi-bin/mapserv?map=/webgis/map/wfs.map&<br><br><br></div><div>premetto che ho notato un comportamento secondo me "anomalo" di qGis (versione 2.4 win32 da osgeo4w): quando richiamo un servizio WFS da un determinato end point, la costruzione delle successive richieste (dopo la GetCapabilities) non avviene con i relativi indirizzi presenti nelle online resources delle capabilities, ma qGis utilizza l'indirizzo usato per richiamare il servizio (l'end point che inserisce l'utente, per intenderci). secondo me questo è sbagliato, se c'è l'online resource perchè non usarlo? e poi questo comportamento mi ha costretto ad andare avanti con la mia ricerca, perchè anche se non elegantissimo, potevo mascherare solamente l'end point iniziale del mio servizio, mantenendo l'indirizzo con percorso al .map per le richieste successive "trasparenti" per l'utente.<br></div><div><br></div><div>quindi mi rimbocco le maniche e vado avanti:<br></div><div>leggo dalla documentazione di Mapserver (in realtà la pagina sul WFS mi rimanda a quella del WMS):<br><a href="http://mapserver.org/ogc/wms_server.html#online-resource-wms" target="_blank">http://mapserver.org/ogc/wms_server.html#online-resource-wms</a><br></div><div>tutti i vari metodi per "nascondere" il percorso completo al .map.<br></div><div><br></div><div>quindi nella mia bella root del web server mi sono creato la cartella "wfs", ho applicato tutte le mie brave regole di rewrite in modo da richiamare da qGis l'indirizzo (che è l'obbiettivo che voglio raggiungere):<br><br></div><div><a href="http://www.miodominio.it/wfs" target="_blank">http://www.miodominio.it/wfs</a><br><br></div><div><br></div>vedo dai log di Apache richiesta in GET proveniente da qGis per la GetCapabilites:<br><div><br>192.168.1.82 - - [30/Oct/2014:12:55:09 +0100] "GET /wfs?REQUEST=GetCapabilities&SERVICE=WFS&VERSION=1.0.0 HTTP/1.1" 301 647 "-" "-"<br>192.168.1.82 - - [30/Oct/2014:12:55:09 +0100] "GET /wfs/?REQUEST=GetCapabilities&SERVICE=WFS&VERSION=1.0.0 HTTP/1.1" 200 3387 "-" "-"<br><br></div><div>e la lista dei layers mi arriva.<br></div><div><br></div><div>quando poi scelgo un layer dalla lista e lo aggiungo al progetto, qGis mi restituisce un errore (layer non valido).<br><br></div><div>leggo dal log di apache la richiesta in POST proveniente da qGis per la GetFeature:<br><br>192.168.1.82 - - [30/Oct/2014:12:55:11 +0100] "POST /wfs? HTTP/1.1" 301 472 "-" "-"<br>192.168.1.82 - - [30/Oct/2014:12:55:11 +0100] "GET /wfs/? HTTP/1.1" 200 209 "-" "-"<br><br></div><div>ci ho messo un bel po' a capire queste due righe del log, 301 è un redirect, 200 va a buon fine,<br></div><div>perchè allora qGis mi da errore?<br><br></div><div>in Apache c'è una bella regola che aggiunge lo slash nell'indirizzo se non c'è (il default è "DirectorySlash On") e questo è un redirect e la mia bella richiesta da POST diventa GET, e ovviamente la GET non ha parametri e Mapserver giustamente risponde ciccia.<br><br></div><div>ragazzi che fatica!<br></div><div><br></div><div>leggo da qui [<a href="http://httpd.apache.org/docs/current/mod/mod_dir.html" target="_blank">http://httpd.apache.org/docs/current/mod/mod_dir.html</a>]:<br><br>"Also note that some browsers may erroneously change POST requests into GET
        (thus discarding POST data) when a redirect is issued."<br><br></div><div>quindi sembra che Apache dia la "colpa" di questo comportamento al "browser" (che nel mio caso è qGis, giusto?): pensate che ci sia modo di "evitare" questo comportamento da parte di qGis?<br></div><div><br></div><div>quindi provo a "evitare" l'aggiunta dello slash finale da parte di Apache:<br></div><div>aggiungo nella mia VirtualDirectory:<br><br>DirectorySlash Off<br><br></div><div>ma non risolvo perchè il /wfs? da errore, e non voglio costringere l'utente a richiamare con /wfs/? (proprio bruttino).<br><br><br><div><br></div>la soluzione finale che ho trovato è:<br><br><br></div><div>abbandonare l'idea di gestire questa cosa con una cartella /wfs e ripiegare sul un bel file python chiamato semplicemente "wfs" messo direttamente nella root (al posto della cartella "wfs"): in questo modo viene saltato il passaggio di aggiunta dello slash finale e del conseguente redirect con perdita dei dati POST.<br></div><div><br></div><div>il mio file /var/www/wfs contiene semplicemente:<br></div><div><br>#!/usr/bin/python<br><br>import mapscript<br><br>req = mapscript.OWSRequest()<br>req.loadParams()<br>map = mapscript.mapObj('/webgis/map/wfs.map')<br>map.OWSDispatch(req)<br><br></div><div>e poi nella configurazione di Apache per la mia root:<br></div><div><br>        <Directory /var/www/><br>                Options Indexes FollowSymLinks MultiViews<br>                AllowOverride None<br>                Order allow,deny<br>                allow from all<br>                Options +ExecCGI +SymLinksIfOwnerMatch<br>        </Directory><br><br></div><div>e per abilitare il mio filettino python per l'esecuzione come cgi:<br></div><div><br>        <FilesMatch wfs$><br>                 SetHandler cgi-script<br>        </FilesMatch><br><br></div><div>e il gioco è fatto.<br><br></div><div>se pensate quindi che questa sia una buona soluzione spero che le mie ore possano essere utili a qualcuno, altrimenti fatemi sapere se ci sono soluzioni diverse, anche che prevedano comportamenti diversi da parte del client.<br><br></div><div>questo l'indirizzo finale del mio WFS da provare:<br><a href="http://www.patrimonioculturale-er.it/wfs">http://www.patrimonioculturale-er.it/wfs</a><br><br></div><div><br><br></div><div>saluti,<br>francesco<br></div><div><br></div><div><br></div><div><br><br></div></div>