我正在使用 Apache 2.2.29 来构建网站。Apache 既可以为 Drupal 提供页面,也可以作为内部应用服务器的反向代理。出于安全原因,我们希望为发送给客户端的所有 cookie 添加 HttpOnly 和 secure 标志。为了做到这一点,我在 Apache 中设置了以下规则
Header edit Set-Cookie "(?i)^((?:(?!;\s?HttpOnly).)+)$" "$1; HttpOnly"
Header edit Set-Cookie "(?i)^((?:(?!;\s?secure).)+)$" "$1; secure"
对于某些 cookie,这很有效,但其他 cookie 则没有被修改。查看响应标头,我看到以下内容:
HTTP/1.1 200 OK
Date: Thu, 20 Nov 2014 22:50:01 GMT
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Thu, 20 Nov 2014 22:50:01 GMT
Cache-Control: store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Set-Cookie: SESSbfb02014bca2e49545c2cacd8a8cfcfa=perqn1l3mn2saselmabnn4vla7; expires=Sun, 14-Dec-2014 02:23:21 GMT; path=/; domain=.www6.server.com; HttpOnly; secure
Set-Cookie: textsize=100; expires=Fri, 20-Nov-2015 22:50:02 GMT; path=/; HttpOnly; secure
X-Cnection: close
Content-Type: text/html; charset=utf-8
Set-Cookie: TS01bd748d=015ca10fb56fc0a5579c6ad014a58a39be63cd86225d41d272c4e99ff818001921bf8a6afe8ff8786edc26a530281a2446ac250c26; Path=/
Set-Cookie: TS01ccb021=015ca10fb57273008302fba8649a42c6cd81f3c49f372d5d34fa4c31fc345f6be3c40dff1b5db114bd54174903e671f755744110dd; path=/; domain=.server.com
Set-Cookie: TS01bd748d_28=01d8892cb5da9e13891c7af98cab63f3bea0d8549b995c92d87d9b10240fcf906df41411935b1d5db889e1e5178debe05972be3916; Path=/
Content-Length: 39891
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
只有前两个 cookie 被修改才能获得标志。其他三个则没有。它们似乎被设置得较晚,或者至少出现在前两个之后。我不知道为什么会有区别,但似乎确实如此。有什么关于如何修复它们的建议吗?
答案1
也许问题在于Header edit
指令在您的应用程序产生响应之前运行,因此如果应用程序正在生成您想要编辑的标题,则该标题在指令运行时还不存在。
根据文献:
Header
[状况]set|append|merge|add|unset|echo|edit header [value] [replacement] [early|env=[!]variable]
可选状况参数确定此指令将针对哪个内部响应标头表进行操作。服务器的其他组件可能已将其响应标头存储在对应的表中
onsuccess
或始终对应的表中。"Always"
在此上下文中指的是您添加的标头是否会在成功和不成功的响应期间发送,但如果您的操作是现有标头的函数,则必须继续阅读以了解进一步的复杂性。在与下列情况类似的情况下,可能需要将的默认值
onsuccess
更改为 always。另请注意,在某些情况下,在两种条件下重复此指令是有意义的,因为对于现有标头而言,always 不是 onsuccess 的超集:
- 您正在向非成功(非 2xx)响应(例如重定向)添加标头,在这种情况下,最终响应中仅使用与始终对应的表。
- 您正在修改或删除由 CGI 脚本生成的标头,在这种情况下,CGI 脚本位于始终对应的表中
,而不是在默认表中。- 您正在修改或删除由服务器某个部分生成的标头,但默认的成功条件未找到该标头。
参考:http://httpd.apache.org/docs/2.2/mod/mod_headers.html
您可以使用 来修复此问题Header always edit
。
例如。
Header always edit Set-Cookie "(?i)^((?:(?!;\s?HttpOnly).)+)$" "$1; HttpOnly"
Header always edit Set-Cookie "(?i)^((?:(?!;\s?secure).)+)$" "$1; secure"
我希望这会有所帮助。