gentile lista, 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.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 /cgi-bin/mapserv?map=/webgis/map/wfs.map& 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. quindi mi rimbocco le maniche e vado avanti: leggo dalla documentazione di Mapserver (in realtà la pagina sul WFS mi rimanda a quella del WMS): http://mapserver.org/ogc/wms_server.html#online-resource-wms tutti i vari metodi per "nascondere" il percorso completo al .map. 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): 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 "-" "-" 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 "-" "-" e la lista dei layers mi arriva. quando poi scelgo un layer dalla lista e lo aggiungo al progetto, qGis mi restituisce un errore (layer non valido). leggo dal log di apache la richiesta in POST proveniente da qGis per la GetFeature: 192.168.1.82 - - [30/Oct/2014:12:55:11 +0100] "POST /wfs? HTTP/1.1" 301 472 "-" "-" 192.168.1.82 - - [30/Oct/2014:12:55:11 +0100] "GET /wfs/? HTTP/1.1" 200 209 "-" "-" ci ho messo un bel po' a capire queste due righe del log, 301 è un redirect, 200 va a buon fine, perchè allora qGis mi da errore? 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. ragazzi che fatica! leggo da qui [http://httpd.apache.org/docs/current/mod/mod_dir.html]: "Also note that some browsers may erroneously change POST requests into GET (thus discarding POST data) when a redirect is issued." 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? quindi provo a "evitare" l'aggiunta dello slash finale da parte di Apache: aggiungo nella mia VirtualDirectory: DirectorySlash Off ma non risolvo perchè il /wfs? da errore, e non voglio costringere l'utente a richiamare con /wfs/? (proprio bruttino). 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. il mio file /var/www/wfs contiene semplicemente: #!/usr/bin/python import mapscript req = mapscript.OWSRequest() req.loadParams() map = mapscript.mapObj('/webgis/map/wfs.map') map.OWSDispatch(req) e poi nella configurazione di Apache per la mia root: <Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all Options +ExecCGI +SymLinksIfOwnerMatch </Directory> e per abilitare il mio filettino python per l'esecuzione come cgi: <FilesMatch wfs$> SetHandler cgi-script </FilesMatch> e il gioco è fatto. 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. saluti, francesco _______________________________________________ [hidden email] http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss Questa e' una lista di discussione pubblica aperta a tutti. I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it. 666+40 iscritti al 5.6.2014 |
Il 18 novembre 2014 16:51, francesco marucci
<[hidden email]> ha scritto: > gentile lista, > vorrei condividere con voi tutti e tutte gioie e dolori di alcune ore [...] > 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? Credo che dovresti aprire un ticket. > 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. > > quindi mi rimbocco le maniche e vado avanti: > leggo dalla documentazione di Mapserver (in realtà la pagina sul WFS mi > rimanda a quella del WMS): > http://mapserver.org/ogc/wms_server.html#online-resource-wms > tutti i vari metodi per "nascondere" il percorso completo al .map. > > 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): > > http://www.miodominio.it/wfs > > > vedo dai log di Apache richiesta in GET proveniente da qGis per la > GetCapabilites: > > 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 "-" > "-" > 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 > "-" "-" > Qui non ti seguo, se ho capito bene hai usato mod_rewrite, in tal caso invece di usare un redirect avresti potuto semplicemente riscrivere l'indirizzo per richiamare il cgi corretto, quindi senza usare il flag [R] e di conseguenza senza mandare un header 301 al client ma servendogli direttamente la pietanza. -- Alessandro Pasotti w3: www.itopen.it _______________________________________________ [hidden email] http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss Questa e' una lista di discussione pubblica aperta a tutti. I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it. 666+40 iscritti al 5.6.2014 |
ciao, e provato anche in altri modi tipo:io ho sicuramente scritto la rewrite rule così (come suggerito da mapserver): RewriteEngine on RewriteRule wfs?(.*) /cgi-bin/mapserv?map=/webgis/map/wfs.map&$1 RewriteEngine on RewriteRule wfs?(.*) /cgi-bin/mapserv?map=/webgis/map/wfs.map&$1 [L,QSA] ma ho capito che le chiamate perdono i dati POST nel momento in cui viene aggiunto all'end point lo slash finale. ma forse ho capito male io, non sono un esperto di apache. mi stai dicendo che così: RewriteEngine on RewriteRule wfs?(.*) /cgi-bin/mapserv?map=/webgis/map/wfs.map&$1 [R] avrebbe funzionato? saluti, francesco Il giorno 18 novembre 2014 17:04, Alessandro Pasotti <[hidden email]> ha scritto:
_______________________________________________ [hidden email] http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss Questa e' una lista di discussione pubblica aperta a tutti. I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it. 666+40 iscritti al 5.6.2014 |
Il 18 novembre 2014 17:23, francesco marucci
<[hidden email]> ha scritto: > ciao, > io ho sicuramente scritto la rewrite rule così (come suggerito da > mapserver): > > RewriteEngine on > RewriteRule wfs?(.*) /cgi-bin/mapserv?map=/webgis/map/wfs.map&$1 > > e provato anche in altri modi tipo: > > RewriteEngine on > RewriteRule wfs?(.*) /cgi-bin/mapserv?map=/webgis/map/wfs.map&$1 [L,QSA] > > ma ho capito che le chiamate perdono i dati POST nel momento in cui viene > aggiunto all'end point lo slash finale. > ma forse ho capito male io, non sono un esperto di apache. > > mi stai dicendo che così: > > RewriteEngine on > RewriteRule wfs?(.*) /cgi-bin/mapserv?map=/webgis/map/wfs.map&$1 [R] > > avrebbe funzionato? > no, dicevo che la R non ci vuole. Il fatto che vedi un 192.168.1.82 - - [30/Oct/2014:12:55:11 +0100] "POST /wfs? HTTP/1.1" 301 472 "-" "-" mi fa pensare che apache mandi un header 301 (moved permanently) al client, e che questo quindi (giustamente) richiami il server con una GET dato che un redirect su chiamate POST non è normalmente implementato su nessun browser. Da questo (senza avere altre informazioni sulle regole di rewrite che hai usato) ho pensato che tu usassi un redirect [R] -- Alessandro Pasotti w3: www.itopen.it _______________________________________________ [hidden email] http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss Questa e' una lista di discussione pubblica aperta a tutti. I messaggi di questa lista non hanno relazione diretta con le posizioni dell'Associazione GFOSS.it. 666+40 iscritti al 5.6.2014 |
Free forum by Nabble | Edit this page |