【问题标题】:standard way to disable X-powered-by header in Passenger?在乘客中禁用 X-powered-by 标头的标准方法?
【发布时间】:2012-01-08 00:38:42
【问题描述】:

我找不到任何方法来禁用乘客的 X-Powered-By 标头:

X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.11

是否可以在不修改其来源在 HTTP 服务器级别删除标头的情况下做到这一点?

【问题讨论】:

  • 我很好奇,你为什么要禁用这些?
  • @MarianTheisen IMO 的一个正当理由是它使 HTTP 响应的标头部分更重,并且它是请求中唯一不能被 gzip 压缩的部分...
  • 很快谷歌搜索提供了成功的答案:groups.google.com/group/phusion-passenger/browse_thread/thread/…
  • @MarianTheisen b/c 拥有此类标头将无法通过您的应用程序的安全审核
  • @MarianTheisen 我刚刚在这一点上未能通过客户端安全审计(而且只有这一点,这很好!)

标签: ruby http-headers passenger


【解决方案1】:

简短回答:没有。

passenger 中没有禁用 X-Powered-by 的配置选项,所以你需要做一个

  • 过滤器
  • 编辑源代码
  • 猴子补丁

乘客代码:

  #RequestHandler::process_request
  headers_output = [
    STATUS, status.to_i.to_s, CRLF,
    X_POWERED_BY, @passenger_header, CRLF
  ]

  #AbstractRequestHandler::initialize
  @passenger_header   = determine_passenger_header

  #AbstractRequestHandler::determine_passenger_header
  def determine_passenger_header
    header = "Phusion Passenger (mod_rails/mod_rack)"
    if @options["show_version_in_header"]
      header << " #{VERSION_STRING}"
    end
    if File.exist?("#{SOURCE_ROOT}/enterprisey.txt") ||
       File.exist?("/etc/passenger_enterprisey.txt")
      header << ", Enterprise Edition"
    end
    return header
  end

【讨论】:

  • 补丁看起来很原始,为什么他们没有实现类似的东西?你认为值得把它寄给他们吗?
  • 如果您使用他们的付费支持级别,我敢打赌这是一个配置参数。
  • ...我认为是 Java 世界变得过于商业化... :)
  • 感谢您发布此信息 - 非常有帮助。我们最终只是从乘客源中删除了它。
  • 这个答案不再正确,因为passenger_show_version_in_header off; 现在存在。
【解决方案2】:

在 Apache 上,您可以取消设置标题:

# Hide/Remove the Passenger Headers
Header always unset "X-Powered-By"
Header always unset "X-Runtime"

它不会删除所有名称(因为 Plesk 等服务仍会附加其名称),但可以通过这种方式删除乘客。

向约翰·特鲁皮亚诺致敬: https://groups.google.com/forum/?fromgroups=#!topic/phusion-passenger/LKAKH0PEyW0

【讨论】:

  • 你需要 headers 模块来做到这一点a2enmod headers
【解决方案3】:

简短回答:

更新:2018 年

如果是下游使用proxy_hide_header,或者使用more_clear_headers


原答案

我保留了我使用 nginx+passenger 的事实 .. 但你可以完全删除它们

remove_header X-Header-Name-To-Remove;

所以你可以删除两者

server {
    ...
    remove_header X-Powered-By;
    remove_header X-Runtime;
    ...
    }

这会删除所有标题,它也可以在位置指令中而不是服务器中。

..

这是我的常用指令,因为我将 'apache prod' equiv 留在了我的身上。

server {
    ...
    remove_header X-Runtime;
    server_tokens off;
    passenger_show_version_in_header off;
    ...
}

提供一个服务标头,如..

Server:nginx + Phusion Passenger
X-Powered-By:Phusion Passenger       

这是我能做的最接近的 apache2 ServerTokens Prod 指令。

【讨论】:

  • 如果我没看错,你是说有一种方法可以删除版本号,但不能删除标题本身
  • 两者都可以。 (见调整答案)
  • 这确实有效,我认为操作要求它不需要在前端代理服务器中进行修改。
  • 好吧抱歉,passenger_show_version_in_header 是乘客配置,remove_header 是 ngnix 指令,这使得这个答案不太正确
  • nginx: [emerg] unknown directive "remove_header"
【解决方案4】:

more_clear_headers 'Server' 'X-Powered-By' 'X-Runtime'; 为我工作,如http://www.michaelrigart.be/en/blog/nginx-and-passenger-install-in-production-environment.html 中所述。

【讨论】:

【解决方案5】:

要从 Nginx+Passenger 中完全删除 X-Powered-ByServer 标头而不只是隐藏版本,请将其添加到 nginx.conf 中的 http 块中:

server_tokens off;
more_clear_headers Server;
more_clear_headers X-Powered-By;

你也可以自己设置:

more_set_headers "Server: ACME";

即使passenger_show_version_in_header off; 未设置,这也可以工作,但以防万一,添加它可能是明智之举。

记得重启服务器以使这些生效。不过,您应该在重新启动之前测试您的配置:sudo nginx -t

信息via calvin.my

【讨论】:

    猜你喜欢
    • 2013-12-28
    • 2011-01-20
    • 2021-12-06
    • 1970-01-01
    • 2019-06-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多