Strona się nie renderuje, klient widzi wyrenderowaną odpowiedź HTTP

Cześć,

W tym zawodzie już się przyzwyczaiłem do rzeczy niemożliwych, ale z tym nie mogę sobie poradzić.

Problem jest taki, że klient przy przeglądaniu strony, czasem dostaje białą stronę wyrenderowaną w przeglądarce, z tekstem odpowiedzi HTTP. Dzieje się to gdy po przejrzeniu podstron, wraca do strony głównej poprzez wciśnięcie buttona “Back” albo poprzez kliknięcie na link do strony głównej.

Klient przesłał screenshot z przeglądarki Firefox, ale problem występuje też w IE8 i Safari. Zwrócona jest odpowiedź 302 Not Modified, zastanawia mnie tylko znak “>”, zaznaczyłem go w kółku, który poprzedza odpowiedź.

Problem jest taki, że nie tyko nie mogę zreplikować tego problemu w żaden sposób, ale również podsłuchując sesję HTTP Wiresharkiem, wszystko wygląda OK. Request od odpowiedzi oddziela pusta linia, nie ma też żadnego znaku “>” poprzedzającego odpowiedź.

Ktoś może miał podobny problem? W czym może być przyczyna?

Wdrożone jest to na CentOS 5.5 + Apache Proxy + Passenger Standalone.

Strzelam że jakiś haisenbug w Apache Proxy lub/i jego konfiguracji.

Może spróbuj wymusić wyłączenie cache i must-revalidate.

Domyślam się, że ten znak “>” jest ostatnim znakiem z poprzedniej odpowiedzi (zamykający tag ").
Na szybko możesz wyłączyć keep-alive, wtedy kilka requestów nie będzie odczytywać z jednego streamu TCP więc ten problem powinien zniknąć. Jeśli tak się stanie to potwierdzi to moją teorię.

Wyłączenie keep alive to oczywiście szybki hack wiec trzeba szukać dalej. To co mi przychodzi do głowy:

  • z jakiegoś powodu railsy/nginx/passenger źle podają content-length (o 1 mniejszy)
  • jakiś rack middleware modyfikuje body, ale nie ustawia poprawnego content-length
  • gzipowanie w nginx, jeśli włączone to sprawdź czy tutaj nie leży problem
  • sprawdź inną wersją nginx (0.8 niby jest stabilne, ale kto go tam wie)

Update:

jeśli takie coś zdarza się tylko i wyłącznie jednemu użytkownikowi (jednej grupie) to może oni korzystają z jakiegoś proxy, które powodują ten problem?

Nie wiem co to, ale ja bym spróbował porównać pakiety między Passangerem i Apache z tymi między Apache i przeglądarką (Wiresharka nie znam, ale polecam ngrep do debugowania HTTP). Spróbuj jeszcze uruchomić to na samym mongrelu, mongrelu + apache, mongrelu + Nginx, może się uda znaleźć element powodujący błąd.

Rozwiązało się :). Otóż wyobraźcie sobie że problemem był niewłaściwy nagłówek content-length ustawiany przez middleware który sam napisałem ;). Więc wina moja a radarek dostaje wielkie podziękowania i szacun!

Lubię takie zagadki - proszę o więcej ;-). Sprawdź jeszcze czy ten middleware jak modyfikuje body ustawia nową wartość ETag a nie zostawia tę ustawioną przez railsy, gdyż potem możesz mieć taką sytuację, że klient dostaje Not Modified z poziomu railsów, chociaż Twój middleware zwróciłby i tak coś innego (bo wstawia np. losową zawartość).