]> granicus.if.org Git - apache/commitdiff
Merge r1811744 from trunk:
authorJim Jagielski <jim@apache.org>
Mon, 13 Nov 2017 13:31:33 +0000 (13:31 +0000)
committerJim Jagielski <jim@apache.org>
Mon, 13 Nov 2017 13:31:33 +0000 (13:31 +0000)
core, mod_rewrite: introduce the 'redirect-keeps-vary' note
                   to allow proper Vary header insertion when
                   dealing with a RewriteRule in a directory
                   context.

This change is an attempt to fix a long standing problem,
brought up while working on PR 58231. Our documentation clearly
states the following:

"If a HTTP header is used in a condition this header is added
to the Vary header of the response in case the condition
evaluates to true for the request."

This is currently not true for RewriteCond/Rules working in
a directory context, since when an internal redirect happens
all the outstanding response headers get dropped.

There might be a better solution so I am looking forward to
hear more opinions and comments. My goal for a delicate change
like this one would be to affect the least amount of configurations
possible, without triggering unwanted side effects.

If the solution is good for everybody tests will be written
in the suite asap.

Submitted by: elukey
Reviewed by: elukey, icing, ylavic

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1815100 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
STATUS
modules/http/http_request.c
modules/mappers/mod_rewrite.c

diff --git a/CHANGES b/CHANGES
index f65f33c29854377050298771d29356be3bf1cf8f..4ce6d1126f26063ff72b5425b11945e014611195 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,10 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.4.30
 
+  *) mod_rewrite, core: add the Vary header when a condition evaluates to true
+     and the related RewriteRule is used in a Directory context
+     (triggering an internal redirect). [Luca Toscano]
+
   *) ab: Make the TLS layer aware that the underlying socket is nonblocking,
      and use/handle POLLOUT where needed to avoid busy IOs and recover write
      errors when appropriate.  [Yann Ylavic]
diff --git a/STATUS b/STATUS
index d2f56d676c24ffc0626d6c02119285fba23222e6..13cb344c1c4f6b3178b451085a372f850ae1ce1e 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -118,13 +118,6 @@ RELEASE SHOWSTOPPERS:
 PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
   [ start all new proposals below, under PATCHES PROPOSED. ]
 
-  *) core, mod_rewrite: introduce the 'keeps-redirect-vary' note in the internal redirect
-                        workflow to keep the Vary headers set by RewriteCond/Rule
-                        directives combinations in the directory context. PR: 58231
-     trunk patch: https://svn.apache.org/r1811744
-     2.4.x: svn merge -c 1811744 ^/httpd/httpd/trunk .
-     +1: elukey, icing, ylavic
-
   *) mod_macro: fix usability of globally defined macros in .htaccess files.
                 PR 57525.
      trunk patch: http://svn.apache.org/r1813643
index 3f5393e04ea94caae363dd3be82dc7a8a281ca6e..bc7ae22dc4750a4b7f89391d5f4866ee53f1b6a4 100644 (file)
@@ -515,6 +515,7 @@ static request_rec *internal_internal_redirect(const char *new_uri,
                                                request_rec *r) {
     int access_status;
     request_rec *new;
+    const char *vary_header;
 
     if (ap_is_recursion_limit_exceeded(r)) {
         ap_die(HTTP_INTERNAL_SERVER_ERROR, r);
@@ -578,6 +579,16 @@ static request_rec *internal_internal_redirect(const char *new_uri,
         if (location)
             apr_table_setn(new->headers_out, "Location", location);
     }
+
+    /* A module (like mod_rewrite) can force an internal redirect
+     * to carry over the Vary header (if present).
+     */
+    if (apr_table_get(r->notes, "redirect-keeps-vary")) {
+        if((vary_header = apr_table_get(r->headers_out, "Vary"))) {
+            apr_table_setn(new->headers_out, "Vary", vary_header);
+        }
+    }
+
     new->err_headers_out = r->err_headers_out;
     new->trailers_out    = apr_table_make(r->pool, 5);
     new->subprocess_env  = rename_original_env(r->pool, r->subprocess_env);
index 05414c49ccb0f1c40294d2506b597999098a25c2..fb897a97604e86b415bbdee49091d6f33be0c573 100644 (file)
@@ -5191,6 +5191,8 @@ static int hook_fixup(request_rec *r)
                 }
             }
 
+            apr_table_setn(r->notes, "redirect-keeps-vary", "");
+
             /* now initiate the internal redirect */
             rewritelog((r, 1, dconf->directory, "internal redirect with %s "
                         "[INTERNAL REDIRECT]", r->filename));