How do you add a custom HTTP response header in Rails?
Asked Answered
B

6

92

I'm looking to add custom HTTP response headers to a Ruby on Rails app that is currently hosted on Heroku.

Bart answered 20/5, 2013 at 16:32 Comment(0)
B
143

Use:

response.headers['HEADER NAME'] = 'HEADER VALUE'

either in a specific method or to a before_filter method of your application controller depending on whether you need this to be added in a specific or to all of your responses.

UPDATE for Rails 5 - February 24th, 2018

As noted by @BrentMatzelle in the comments, for Rails 5:

response.set_header('HEADER NAME', 'HEADER VALUE')
Belvia answered 20/5, 2013 at 16:40 Comment(4)
Make sure that the value you set is a string, otherwise pow will give you strange errorsSpud
To add this to all actions in the controller use a after_action.Deboradeborah
This is not correct. You should not really access the response object. See instead: https://mcmap.net/q/224898/-how-do-you-add-a-custom-http-response-header-in-rails and read the the comments!Folie
The BrentMatzelle comment is gone. Why is response.set_header('HEADER NAME', 'HEADER VALUE') preferred now?Woods
F
24

In rails 5, the following solution works (in action methods)

response.set_header("Header-Name", "Header value")

Reference: edgeapi

Frog answered 24/12, 2016 at 7:42 Comment(0)
R
23

In Rails 3 or above, simply

headers['Header-Name'] = 'header value'

works in controllers. This is even the recommended way; according to the documentation,

Response is mostly a Ruby on Rails framework implementation detail, and should never be used directly in controllers. Controllers should use the methods defined in ActionController::Base instead. For example, if you want to set the HTTP response’s content MIME type, then use ActionController::Base#headers instead of Response#headers.

And this is still true in Rails 7.0.

Residuum answered 25/6, 2017 at 5:25 Comment(3)
This is the most correct answer. Still most people ignore the documentation and use response object.Valois
I don't understand the issue with using response, even the guides say "If you want to set custom headers for a response then response.headers is the place to do it." and headers are delegated from action controller to response. github.com/rails/rails/blob/v5.2.0/actionpack/lib/…Vrablik
@Vrablik I think this is called encapsulation. Using the public interface is more robust, even if it simply delegates to a private interface; for example, in future the Rails team might want to add something in the headers method, which breaks you if you directly access the response. This is no new concept; in Java, many public getFoo() methods simply get you the private variable this.foo.Residuum
C
9

In rails 4, set the response headers in the application.rb or respective environment files. Once you done that, you can override the header value wherever you required in the controller. Refer this url for more details.

Chincapin answered 28/9, 2015 at 6:16 Comment(0)
B
5

If your headers are static, e.g. your own custom Server header, you can simply update config.action_dispatch.default_headers. The following example sets a custom Server header; add it to your config/application.rb or config/environments/...:

config.action_dispatch.default_headers["Server"] = "MyServer/#{config.version}"

(Assuming you set config.version earlier)

For more, see Rails Guides: Configuring Rails Applications: Configuring Action Dispatch:

config.action_dispatch.default_headers is a hash with HTTP headers that are set by default in each response.

This will be less work each request than running a controller callback.

NB: For more than one header use merge! to not remove existing essential XSS etc headers.

Braswell answered 24/7, 2020 at 22:2 Comment(0)
A
4

In rails 4 works following:

class API::V1::BaseController 
  after_action :set_version_header

  protected
    def set_version_header
        response.headers['X-ComanyName-Api-Version'] = 'V1'
    end
end
Abase answered 21/2, 2017 at 8:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.