2010-08-02 39 views
21

Tôi có một webapp được xây dựng với Django. Tôi hiện đang chạy nó ra khỏi một máy tính xách tay ở nhà phía sau một bộ định tuyến.Http POST giảm cổng trong URL

Tôi có bộ định tuyến được định cấu hình để định tuyến tất cả lưu lượng truy cập được gửi đến một cổng cụ thể đến máy tính xách tay đó.

Tôi có Nginx làm proxy ngược cho Apache, sử dụng mod_wsgi để chạy Django.

Vấn đề của tôi là thế này: khi tôi cố gắng để gửi bất kỳ hình thức POST, cảng # sẽ bị xoá khỏi url (ví dụ 209.245.23.201:1552/login/ trở thành 209.245.23.201/login/)

Đương nhiên, điều này phá vỡ. Điều gì gây ra điều này (Nginx, Apache, Django?) Và làm thế nào tôi có thể sửa chữa nó?

Xin cảm ơn trước.

EDIT: Dường như các biểu mẫu DO gửi đi, nhưng tôi nghĩ chuyển hướng không thành công.

CHỈNH SỬA 2: Vấn đề chắc chắn là với Nginx hoặc tương tác giữa Nginx và Apache. Tôi đã thử các thiết lập với Apache là máy chủ duy nhất, chạy django, và nó làm việc tốt. Vì vậy, hoặc Nginx là thả cảng, hoặc bằng cách nào đó Apache đang bị nhầm lẫn bởi Nginx hành động như proxy.whatever

+0

câu hỏi ngớ ngẩn ... làm thế nào để bạn biết rằng số cổng bị xóa? Làm thế nào bạn tìm ra? – luiscolorado

+0

Nó theo nghĩa đen sẽ bị xóa khỏi url trong thanh địa chỉ của tôi. –

+0

Đây có thể là sự cố trình duyệt. Bạn đang dùng trình duyệt nào? –

Trả lời

40

Tôi có cùng sự cố với máy chủ phát triển của mình. Sau khi tìm kiếm trên internet, tôi đã tìm thấy cuộc thảo luận này (nginx, apache, and odd admin error), nơi giải pháp là sửa đổi cấu hình proxy của nginx.

Các thiết lập cấu hình để sửa đổi là:

proxy_set_header   Host $host; 

giải pháp là để thêm số cổng:

proxy_set_header   Host $host:$server_port; 

Trong ngnix + apache2 (với công nhân MPM) + django của tôi bây giờ tất cả hoạt động tốt .

+0

Tôi đã có vấn đề chính xác cùng với môi trường dev nhà của tôi và điều này giải quyết nó. Đây sẽ là câu trả lời được chấp nhận cho câu hỏi này. – mitchf

+2

Trong trường hợp của tôi $ server_port không được giải quyết và tôi đã phải đặt server_port của tôi theo cách thủ công ("$ host: 8080"). –

+0

Cảm ơn Techside, điều này thật tuyệt. Tôi sẽ thêm rằng tôi đã phải làm tương tự như Amit, khi chạy Nginx + Django ở Vagrant, nơi Vagrant ánh xạ bên ngoài: 8000 đến nội bộ: 80 và nginx đang proxy nội bộ: 80 đến django ở bên trong: 8000. $ server_port không được giải quyết, có thể là do 80 trên nginx. – kibibu

6

Cho tất cả mọi thứ bạn đang quan tâm với rõ ràng HTTP (không giống như một cái gì đó như AJP ví dụ) Tôi muốn chạy một giao thức phân tích như Wireshark trên máy chủ và xác định tại thời điểm chuyển hướng được giới thiệu.

2

Kiểm tra nhật ký lỗi. Trên Linux, tôi đang ở/var/log/apache2. Chỉ cần chạy một tìm kiếm cho error.log sẽ bật lên.

10

Bạn muốn vượt qua trên HTTP header chủ gốc, mà đến nginx:

proxy_set_header Host $http_host; 

này dường như là một lỗi với cấu hình mặc định của nginx trong Debian/Ubuntu, mà chỉ sử dụng $host: $host sẽ không chứa $server_port. (Điều này được cấu hình trong /etc/nginx/proxy_params cho gói Debian/Ubuntu, và bạn có thể ghi đè lên nó trong cấu hình của bạn sau đó có nó.)

Xin lưu ý rằng $host:$server_port là khác nhau từ $http_host. Xem http://wiki.nginx.org/HttpCoreModule#.24host để được giải thích.

Báo cáo và cố định trong Debian: http://bugs.debian.org/733016

+1

Điều này giải quyết vấn đề của tôi. Câu trả lời được chấp nhận không – Philip007

+0

Điều này chắc chắn là con đường để đi.Tôi đã đường hầm thông qua một trường hợp Vagrant vì vậy cổng của tôi là khác nhau trên máy chủ nginx, máy chủ Django và phía trình duyệt của tôi. –

+0

Xin lỗi câu hỏi noob, nhưng ở đâu trong cấu hình nginx thì dòng proxy_set_header lại đi? Bên trong khối vị trí? Sau khi nghe dòng? Ở đâu khác? Cảm ơn! – Dashdrum

0

Nếu bạn thấy rằng điều này xảy ra với một url có nguồn gốc từ phương pháp get_absolute_url() của một người mẫu, bạn nên sử dụng vượt qua con đường đó để HttpRequest.build_absolute_url() để thêm vào trước tên máy và cổng vào đường dẫn.