Clear old Location header (if any) while adding a new one.
This prevents incorrect behaviour when another redirect is issued within error_page 302 handler.
This commit is contained in:
parent
86955ecc8e
commit
c135f3d325
5 changed files with 17 additions and 0 deletions
|
@ -139,6 +139,8 @@ ngx_http_static_handler(ngx_http_request_t *r)
|
||||||
|
|
||||||
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http dir");
|
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http dir");
|
||||||
|
|
||||||
|
ngx_http_clear_location(r);
|
||||||
|
|
||||||
r->headers_out.location = ngx_palloc(r->pool, sizeof(ngx_table_elt_t));
|
r->headers_out.location = ngx_palloc(r->pool, sizeof(ngx_table_elt_t));
|
||||||
if (r->headers_out.location == NULL) {
|
if (r->headers_out.location == NULL) {
|
||||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||||
|
|
|
@ -983,6 +983,8 @@ ngx_http_core_find_config_phase(ngx_http_request_t *r,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rc == NGX_DONE) {
|
if (rc == NGX_DONE) {
|
||||||
|
ngx_http_clear_location(r);
|
||||||
|
|
||||||
r->headers_out.location = ngx_list_push(&r->headers_out.headers);
|
r->headers_out.location = ngx_list_push(&r->headers_out.headers);
|
||||||
if (r->headers_out.location == NULL) {
|
if (r->headers_out.location == NULL) {
|
||||||
ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
|
ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
|
||||||
|
@ -1796,6 +1798,8 @@ ngx_http_send_response(ngx_http_request_t *r, ngx_uint_t status,
|
||||||
|
|
||||||
if (status >= NGX_HTTP_MOVED_PERMANENTLY && status <= NGX_HTTP_SEE_OTHER) {
|
if (status >= NGX_HTTP_MOVED_PERMANENTLY && status <= NGX_HTTP_SEE_OTHER) {
|
||||||
|
|
||||||
|
ngx_http_clear_location(r);
|
||||||
|
|
||||||
r->headers_out.location = ngx_list_push(&r->headers_out.headers);
|
r->headers_out.location = ngx_list_push(&r->headers_out.headers);
|
||||||
if (r->headers_out.location == NULL) {
|
if (r->headers_out.location == NULL) {
|
||||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||||
|
|
|
@ -529,5 +529,12 @@ extern ngx_str_t ngx_http_core_get_method;
|
||||||
r->headers_out.last_modified = NULL; \
|
r->headers_out.last_modified = NULL; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define ngx_http_clear_location(r) \
|
||||||
|
\
|
||||||
|
if (r->headers_out.location) { \
|
||||||
|
r->headers_out.location->hash = 0; \
|
||||||
|
r->headers_out.location = NULL; \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* _NGX_HTTP_CORE_H_INCLUDED_ */
|
#endif /* _NGX_HTTP_CORE_H_INCLUDED_ */
|
||||||
|
|
|
@ -1106,6 +1106,8 @@ ngx_http_script_regex_end_code(ngx_http_script_engine_t *e)
|
||||||
"rewritten redirect: \"%V\"", &e->buf);
|
"rewritten redirect: \"%V\"", &e->buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngx_http_clear_location(r);
|
||||||
|
|
||||||
r->headers_out.location = ngx_list_push(&r->headers_out.headers);
|
r->headers_out.location = ngx_list_push(&r->headers_out.headers);
|
||||||
if (r->headers_out.location == NULL) {
|
if (r->headers_out.location == NULL) {
|
||||||
e->ip = ngx_http_script_exit;
|
e->ip = ngx_http_script_exit;
|
||||||
|
|
|
@ -582,6 +582,8 @@ ngx_http_send_error_page(ngx_http_request_t *r, ngx_http_err_page_t *err_page)
|
||||||
ngx_str_set(&location->key, "Location");
|
ngx_str_set(&location->key, "Location");
|
||||||
location->value = uri;
|
location->value = uri;
|
||||||
|
|
||||||
|
ngx_http_clear_location(r);
|
||||||
|
|
||||||
r->headers_out.location = location;
|
r->headers_out.location = location;
|
||||||
|
|
||||||
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
|
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
|
||||||
|
|
Loading…
Reference in a new issue