2015-01-06 11 views
5

tôi cần phải bảo vệ dữ liệu POST đến một url khác nhaunginx viết lại bài dữ liệu

Các tác phẩm viết lại nhưng dữ liệu bị mất bài

cần phải gửi dữ liệu từ user_info.php để userhistory

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

Dữ liệu bị mất. Làm thế nào tôi có thể bảo toàn dữ liệu?

Trả lời

2

Về cơ bản, bạn muốn tự động chuyển hướng một yêu cầu POST bằng cách chuyển 301 Chuyển hướng vĩnh viễn.

Tuy nhiên. chuyển hướng như vậy là không được phép đặc biệt bởi các HTTP Specifications mà nói rằng:

Nếu mã 301 trạng thái được nhận để đáp ứng với yêu cầu khác hơn là GET hoặc HEAD, user agent PHẢI KHÔNG tự động chuyển hướng yêu cầu trừ khi nó có thể được khẳng định bởi người dùng, vì điều này có thể thay đổi các điều kiện theo đó yêu cầu được đưa ra.

Các thông số kỹ thuật cũng lưu ý rằng:

Khi tự động chuyển hướng một yêu cầu POST sau khi nhận được một mã trạng thái 301, một số đại lý HTTP/1.0 dùng hiện tại sẽ sai lầm thay đổi nó thành một yêu cầu GET.

Tôi tin rằng tình huống thứ hai có thể là những gì đang xảy ra và rằng trong khi máy chủ mục tiêu đang mong đợi dữ liệu POST, nó sẽ nhận dữ liệu GET thay thế.

Lựa chọn của bạn là:

A. Thay đổi mã để làm việc với dữ liệu GET hoặc tốt hơn, cả POST và GET. I.E., tìm POST và nếu không có, hãy thử GET tương đương.

B. Hãy thử đảm bảo mã nhận dữ liệu POST bằng cách làm việc với Spec.

Bạn có thể đạt được Lựa chọn B bằng cách sử dụng chỉ thị proxy_pass để xử lý yêu cầu thay thế.

Something như:

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; 
} 

Bằng cách này, người dùng được về mặt kỹ thuật không được chuyển hướng.

+0

cảm ơn, ngay bây giờ Im gửi dữ liệu bài qua curl. – meWantToLearn

1

Bạn chỉ cần viết một quy tắc viết lại Nginx với mã trạng thái HTTP 307 hoặc 308:

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

mã trạng thái HTTP 307 hoặc 308 nên được sử dụng thay vì 301 vì nó thay đổi phương thức yêu cầu từ POST để GET .Tham khảo https://tools.ietf.org/id/draft-reschke-http-status-308-07.html#introduction

Cũng chuyển hướng qua return được tốt hơn so với rewrite theo nginx doc: https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites

2

Trong conf của tôi, tôi sử dụng try_files với regex

ví dụ

location /yourfolder/(?<specialRequest>.*) { 
    try_files $uri /yourfolder/index.php?r=$specialRequest; 
    return 307 https://$host/yourfolder/index.php?r=$specialRequest; // it also work 
} 
Các vấn đề liên quan