我正在编写apache模块,我在编写一个新的cookie以便通过响应发送到浏览器时遇到困难.
我正在尝试ap_cookie_write按照文档中的说明使用.
第一个问题 - 我不认为在request_rec将cookie发送回客户端时会在遗嘱上设置cookie ,那么我怎么能真正添加cookie呢?
第二个问题 - 此代码:
if (ap_cookie_write(ctx->r, "_mycookie", "", NULL, 0L) != APR_SUCCESS) {
ERROR(ctx->r->server, "Could not write _mycookie empty value");
}
Run Code Online (Sandbox Code Playgroud)
导致此崩溃:
[Wed Aug 03 10:09:51.712610 2016] [core:debug] [pid 17272:tid 140219016423168] util_cookies.c(59): [client 10.20.1.35:52967] AH00007: ap_cookie: user '(null)' set cookie: '_mycookie=;HttpOnly;Secure;Version=1', referer: http://10.20.1.203/
[Wed Aug 03 10:09:52.389575 2016] [core:notice] [pid 32421:tid 140219219822464] AH00051: child pid 17272 exit signal Segmentation fault (11), possible coredump in /etc/apache2
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?通过查看源代码,我发现不需要分配我发送的字符串.
更新
至于第二个问题 - 我发现varargs列表必须结束,NULL以便修复seg错误:
if (ap_cookie_write(ctx->r, "_mycookie", "", NULL, 0L, NULL) != APR_SUCCESS) {
ERROR(ctx->r->server, "Could not write _mycookie empty value");
}
Run Code Online (Sandbox Code Playgroud)
但现在cookie没有返回响应.
您需要提供ap_cookie_write要添加 cookie 的标头表。正如文档所说:
由零个或多个 (apr_table_t *) 表组成的 varargs 数组,后跟应添加 cookie 的 NULL。
Cookie 与标头有什么关系?
Cookie 是通过Set-Cookie(或Set-Cookie2 )标头添加/删除的。
为什么需要提供头表?
request_rec 实例有两个头表,headers_out 和 err_headers_out。
headers_out 和 err_headers_out 之间的区别在于,后者即使出现错误也会打印,并且在内部重定向中持续存在(因此为 ErrorDocument 处理程序打印的标头将包含它们)。
例如,如果处理程序想要返回 404 响应,但仍然要设置 cookie,则必须是:
$r->err_headers_out->add('Set-Cookie' => $cookie); 返回 Apache2::Const::NOT_FOUND;如果处理程序执行以下操作:
$r->headers_out->add('Set-Cookie' => $cookie); 返回 Apache2::Const::NOT_FOUND;Set-Cookie 标头不会被发送。
(来源)
因此,ap_cookie_write无法知道要使用哪个标头表(如果有)。如果需要,您可以提供其他不相关的表。
就您而言,您可能想要执行以下操作:
request_rec *r = ctx->r;
ap_cookie_write(r, "_mycookie", "", NULL, 0L, r->headers_out, r->err_headers_out, NULL);
Run Code Online (Sandbox Code Playgroud)