<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>coderliu (刘二狗)</title>
    <link>https://ruby-china.org/coderliu</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Rails 为什么默认把 HEAD 请求当做 GET 来处理？</title>
      <description>&lt;p&gt;&lt;a href="http://www.cnblogs.com/little-bai/p/5711185.html" rel="nofollow" target="_blank" title=""&gt;[Rails] 从 Request 到 Response（1）&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;在上面的这篇文章中看到这么一段&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;config.middleware.delete 'ActionDispatch::Head'      # 如果是 HEAD 请求，按照 GET 请求执行，但是不返回 body&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;才知道 Rails 默认会把 HEAD 请求当做 GET 处理。&lt;/p&gt;

&lt;p&gt;之前遇到过在修改页面，Retina 设备设置密码失败的问题，也许这一默认行为就是这个问题的根源。&lt;/p&gt;

&lt;p&gt;案发现场大致如下：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;验证码使用 RuCaptcha&lt;/li&gt;
&lt;li&gt;网站使用了 Retina.js 来适配 Retina 设备&lt;/li&gt;
&lt;li&gt;Retina.js 在修改密码页面会通过 HEAD 请求来探测是否有可用的 2 倍图&lt;/li&gt;
&lt;li&gt;Retina.js 使用 HEAD 方法请求了提交表单的 URI，Rails 把该请求当做 GET 处理，这导致 session 中的部分数据被修改&lt;/li&gt;
&lt;li&gt;用户自己提交表单时因为 session 内的数据不符合要求，修改密码失败&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;结论：使用 Rails + Retina.js 要小心这个坑&lt;/p&gt;

&lt;p&gt;疑问：Rails 为什么默认把 HEAD 请求当做 GET 来处理？&lt;/p&gt;</description>
      <author>coderliu</author>
      <pubDate>Thu, 09 Mar 2017 15:51:51 +0800</pubDate>
      <link>https://ruby-china.org/topics/32488</link>
      <guid>https://ruby-china.org/topics/32488</guid>
    </item>
  </channel>
</rss>
