2015-01-06 15 views
5

ho bisogno di conservare i dati POST a un URL diversonginx riscrittura dati post

I lavori di riscrittura, ma i dati POST viene perso

necessità di inviare i dati da user_info.php a userhistory

location ~ user_info.php { 
    rewrite ^/.* http://testing.com/userhistory permanent; 
} 

I dati sono persi. Come posso conservare i dati?

risposta

2

In pratica, si desidera reindirizzare automaticamente una richiesta POST utilizzando un reindirizzamento permanente 301 spostato.

Tuttavia. tale reindirizzamento sono specificamente annullato dal HTTP Specifications quale:

Se il codice di stato 301 è ricevuto in risposta ad una richiesta diversa GET o HEAD, l'agente utente NON DEVE reindirizzare automaticamente la richiesta a meno che non può essere confermato dall'utente, poiché ciò potrebbe modificare le condizioni in base alle quali è stata emessa la richiesta.

Spec inoltre notare che:

Quando reindirizzando automaticamente una richiesta POST che riceve un codice di stato 301, alcuni agenti esistenti HTTP/1.0 UTENTE erroneamente trasformarla in una richiesta GET.

credo che la seconda situazione può essere quello che sta succedendo e che, mentre il server di destinazione è in attesa di dati POST, sta ricevendo i dati GET, invece.

Le scelte sono:

A. Cambiare il codice per lavorare con i dati GET o, meglio ancora, sia POST e GET. I.E., cerca POST e se no, prova GET equivalenti.

B. Cercare di garantire che il codice riceva i dati POST lavorando con la specifica.

Potrebbe essere possibile ottenere la scelta B utilizzando la direttiva proxy_pass per gestire invece la richiesta.

Qualcosa come:

location ~ user_info.php { 
    proxy_pass http://testing.com/userhistory; 
    proxy_redirect off; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
} 

In questo modo, l'utente è tecnicamente reindirizzato.

+0

grazie, in questo momento Im inviando i dati del post tramite arricciatura. – meWantToLearn

1

Hai solo bisogno di scrivere una regola di riscrittura Nginx con codice di stato HTTP 307 o 308:

location ~ user_info.php { 
    return 307 http://testing.com/userhistory; 
} 

codice di stato HTTP 307 o 308 dovrebbe essere utilizzato al posto di 301 perché cambia il metodo di richiesta da POST a GET .Fare riferimento https://tools.ietf.org/id/draft-reschke-http-status-308-07.html#introduction

anche riorientare via return è migliore rispetto a rewrite secondo le nginx doc: https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites

2

Nel mio conf io uso try_files con espressioni regolari

ad esempio

location /yourfolder/(?<specialRequest>.*) { 
    try_files $uri /yourfolder/index.php?r=$specialRequest; 
    return 307 https://$host/yourfolder/index.php?r=$specialRequest; // it also work 
}