diff --git a/proxy/config/body_factory/default/redirect#moved_permanently b/proxy/config/body_factory/default/redirect#moved_permanently new file mode 100644 index 00000000000..a5c50369e89 --- /dev/null +++ b/proxy/config/body_factory/default/redirect#moved_permanently @@ -0,0 +1,14 @@ + + +Document Has Moved + + + +

Document Has Moved

+
+ + +Description: The document you requested has moved to a new location. The new location is "%<{Location}psh>". + +
+ diff --git a/proxy/http/HttpTransact.cc b/proxy/http/HttpTransact.cc index 9692d998a2d..710724a95eb 100644 --- a/proxy/http/HttpTransact.cc +++ b/proxy/http/HttpTransact.cc @@ -848,7 +848,6 @@ HttpTransact::EndRemapRequest(State* s) build_error_response(s, HTTP_STATUS_MOVED_TEMPORARILY, "Redirect", "redirect#moved_temporarily", "\"%s\".

", s->remap_redirect); } - s->hdr_info.client_response.value_set(MIME_FIELD_LOCATION, MIME_LEN_LOCATION, s->remap_redirect, strlen(s->remap_redirect)); ats_free(s->remap_redirect); s->reverse_proxy = false; goto done; @@ -882,6 +881,10 @@ HttpTransact::EndRemapRequest(State* s) /////////////////////////////////////////////////////////////// if (!s->url_remap_success) { + if (handleIfRedirect(s)) { + DebugTxn("http_trans", "END HttpTransact::RemapRequest"); + TRANSACT_RETURN(PROXY_INTERNAL_CACHE_NOOP, NULL); + } ///////////////////////////////////////////////////////// // check for: (1) reverse proxy is on, and no URL host // ///////////////////////////////////////////////////////// @@ -1242,9 +1245,9 @@ HttpTransact::handleIfRedirect(State *s) answer = request_url_remap_redirect(&s->hdr_info.client_request, &redirect_url); if ((answer == PERMANENT_REDIRECT) || (answer == TEMPORARY_REDIRECT)) { int remap_redirect_len; - char *remap_redirect; - remap_redirect = redirect_url.string_get_ref(&remap_redirect_len); + s->remap_redirect = redirect_url.string_get(NULL, &remap_redirect_len); + redirect_url.destroy(); if (answer == TEMPORARY_REDIRECT) { if ((s->client_info).http_version.m_version == HTTP_VERSION(1, 1)) { build_error_response(s, HTTP_STATUS_TEMPORARY_REDIRECT, @@ -1252,7 +1255,7 @@ HttpTransact::handleIfRedirect(State *s) "Redirect", "redirect#moved_temporarily", "%s %s. %s", "The document you requested is now", - remap_redirect, remap_redirect, "Please update your documents and bookmarks accordingly"); + s->remap_redirect, s->remap_redirect, "Please update your documents and bookmarks accordingly"); } else { build_error_response(s, HTTP_STATUS_MOVED_TEMPORARILY, @@ -1260,7 +1263,7 @@ HttpTransact::handleIfRedirect(State *s) "redirect#moved_temporarily", "%s %s. %s", "The document you requested is now", - remap_redirect, remap_redirect, "Please update your documents and bookmarks accordingly"); + s->remap_redirect, s->remap_redirect, "Please update your documents and bookmarks accordingly"); } } else { build_error_response(s, @@ -1269,10 +1272,10 @@ HttpTransact::handleIfRedirect(State *s) "redirect#moved_permanently", "%s %s. %s", "The document you requested is now", - remap_redirect, remap_redirect, "Please update your documents and bookmarks accordingly"); + s->remap_redirect, s->remap_redirect, "Please update your documents and bookmarks accordingly"); } - s->hdr_info.client_response.value_set(MIME_FIELD_LOCATION, MIME_LEN_LOCATION, remap_redirect, remap_redirect_len); - redirect_url.destroy(); + ats_free(s->remap_redirect); + s->remap_redirect = NULL; return true; } @@ -8154,6 +8157,13 @@ HttpTransact::build_error_response(State *s, HTTPStatus status_code, const char s->hdr_info.client_response.field_delete(MIME_FIELD_EXPIRES, MIME_LEN_EXPIRES); s->hdr_info.client_response.field_delete(MIME_FIELD_LAST_MODIFIED, MIME_LEN_LAST_MODIFIED); + if ((status_code == HTTP_STATUS_TEMPORARY_REDIRECT || + status_code == HTTP_STATUS_MOVED_TEMPORARILY || + status_code == HTTP_STATUS_MOVED_PERMANENTLY) && + s->remap_redirect) { + s->hdr_info.client_response.value_set(MIME_FIELD_LOCATION, MIME_LEN_LOCATION, s->remap_redirect, strlen(s->remap_redirect)); + } + ///////////////////////////////////////////////////////////// // deallocate any existing response body --- it's possible // @@ -8195,7 +8205,7 @@ HttpTransact::build_error_response(State *s, HTTPStatus status_code, const char reason_phrase = reason_buffer; } - if (s->http_config_param->errors_log_error_pages) { + if (s->http_config_param->errors_log_error_pages && status_code >= HTTP_STATUS_BAD_REQUEST) { char ip_string[INET6_ADDRSTRLEN]; Log::error("RESPONSE: sent %s status %d (%s) for '%s'",