Why are IE6 and Firefox rendering different formats from the same URL?

I have a controller action in my Rails 2.0.2 app that looks like this:

   def matrix      @shows = Show.find(:all)      @players = Player.find(:all)      respond_to do |format|        format.html        format.xls do          set_excel_headers(headers,"matrix-#{@show_year}-#{@show_month}.xls")        end      end    end

In Firefox, this works exactly as expected - when I go to /signups/matrix, I get the HTML format rendered. If I go to /signups/matrix.xls, I get the Excel version.

However, when I do the same thing on IE6/XP, I get the Excel format rendered for both. /signups/matrix tries to download the Excel file.

The log doesn't show anything odd that I can tell:

Processing SignupsController#matrix (for 192.168.119.1 at 2008-05-14 20:03:57) [GET]    Session ID: 39a88d1fff075058276e65d67136f7dd    Parameters: {"action"=>"matrix", "controller"=>"signups"}

[....]

Completed in 0.23381 (4 reqs/sec) | Rendering: 0.03932 (16%) | DB: 0.09844 (42%) | 200 OK [http://192.168.119.1/signups/matrix\]

I'm stumped - does anyone know why this would be happening?

--Wade

The key to this behavior is the Accept header of the HTTP request. You can check it in Rails with request.headers['HTTP_ACCEPT'] (see ActionController::AbstractRequest).

IE6 prefers MS Office content (Excel, Powerpoint, Word) over HTML: ... Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel,          application/msword, application/vnd.ms-powerpoint, */* ... (I got this from http://www.ibm.com/developerworks/xml/library/x-tipapachexhtml/index.html as I don't have IE6 installed.)

So (X)HTML mimetypes don't even appear explicitly, they're caught by the wildcard */* and have the lowest priority.

Very strange, but this is how Microsoft wanted it to be. They fixed this in the meantime. The Internet Explorer 8 beta header says simply:   Accept: */*

To be sure to get the HTML rendering, say /signups/matrix.html . I guess you could also tinker with your HTTP server settings to give the HTML mimetypes higher priority.

H. Wade Minter wrote:

Thanks for the tip - I went in and changed application/vnd.ms-excel to
application/octet-stream in the initializer/mime_types.rb file, and it
seems to be performing expected behavior now.

Thanks again!

--Wade