You are viewing a plain text version of this content. The canonical link for it is here.
Posted to bugs@httpd.apache.org by bu...@apache.org on 2015/08/11 13:59:39 UTC

[Bug 58231] New: RewriteCond can add "Host" to the Vary-Header

https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

            Bug ID: 58231
           Summary: RewriteCond can add "Host" to the Vary-Header
           Product: Apache httpd-2
           Version: 2.4.16
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: mod_rewrite
          Assignee: bugs@httpd.apache.org
          Reporter: rainer-apache@7val.com

A RewriteCond that evaluates %{HTTP_HOST} automatically adds "Host" to the
Vary-Header. This is unnecessary and not permitted according to
https://tools.ietf.org/html/rfc7231#section-7.1.4

> The "Vary" header field in a response describes what parts of a request message, aside from the method, Host header field, and request target, might influence the origin server's process for selecting and representing this response.

The RewriteRule that triggered the Vary: Host for me is below, however, I'm
certain simpler examples can be constructed:

RewriteCond expr "%{HTTP_REFERER} =~ m#^https?://([^/:]+)# && %{HTTP_HOST}.':'
-strmatch '$1:*'"
RewriteRule ^ - [env=FOO:bar]

> GET /foo/lenna/ HTTP/1.1
> User-Agent: curl/7.38.0
> Host: pahuanuiapitaaitera.office.sevenval.de:14020
> Accept: */*
> Referer: http://$1/
> 
< HTTP/1.1 200 OK
< Date: Tue, 11 Aug 2015 11:58:01 GMT
< Server: Apache
< Vary: User-Agent,Referer,Host,Accept-Encoding
[,...]

-- 
You are receiving this mail because:
You are the assignee for the bug.

---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #8 from Luca Toscano <to...@gmail.com> ---
The following seems to remove the Vary: Host header combination from
mod_rewrite and <If> expression evaluation:

Index: modules/mappers/mod_rewrite.c
===================================================================
--- modules/mappers/mod_rewrite.c       (revision 1808672)
+++ modules/mappers/mod_rewrite.c       (working copy)
@@ -2035,7 +2035,10 @@

             case 'S':
                 if (!strcmp(var, "HTTP_HOST")) {
-                    result = lookup_header("Host", ctx);
+                    /* Skip the 'Vary: Host' header combination
+                     * as indicated in rfc7231 section-7.1.4
+                     */
+                    result = apr_table_get(ctx->r->headers_in, "Host");
                 }
                 break;

Index: server/util_expr_eval.c
===================================================================
--- server/util_expr_eval.c     (revision 1808672)
+++ server/util_expr_eval.c     (working copy)
@@ -1606,7 +1606,12 @@
         return "";

     name = req_header_header_names[index];
-    add_vary(ctx, name);
+    /* Skip the 'Vary: Host' header combination
+     * as indicated in rfc7231 section-7.1.4
+     */
+    if (strcmp(name, "Host")){
+        add_vary(ctx, name);
+    }
     return apr_table_get(ctx->r->headers_in, name);
 }

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #9 from Luca Toscano <to...@gmail.com> ---
Fixed in trunk with:

http://svn.apache.org/r1808746
http://svn.apache.org/r1809028

I am going to write some tests and then propose the fix for 2.4.x.

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #7 from Luca Toscano <to...@gmail.com> ---
I found the following example as proof of issues originated from the Vary:
Host:

http://www.nivas.hr/blog/2017/02/13/apache-sending-vary-host-making-things-uncacheable-varnish/

I still haven't been able to get a response with Vary:Host using mod_rewrite
(although I can see from the code that it explicitly set if when it finds it in
a RewriteCond, so probably I am doing something wrong in my config) but I found
another way to get it:

  <If '%{HTTP_HOST} -eq "bla"'> [..] </If>

It makes sense since I can see a add_vary function in util_expr_eval.c. As far
as I understand the RFC explicitly prohibits the Vary: Host header, so it
should be prevented in out codebase. 

Any opinion?

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

Luca Toscano <to...@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|---                         |FIXED

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #16 from Luca Toscano <to...@gmail.com> ---
(In reply to Yann Ylavic from comment #15)
> Maybe using err_headers_out (instead of headers_out) to set Vary in the
> first place?

Yann you are awesome as usual, the following seems working perfectly:

Index: modules/mappers/mod_rewrite.c
===================================================================
--- modules/mappers/mod_rewrite.c       (revision 1810117)
+++ modules/mappers/mod_rewrite.c       (working copy)
@@ -5276,6 +5276,8 @@
  */
 static int handler_redirect(request_rec *r)
 {
+    const char *vary_headers;
+
     if (strcmp(r->handler, REWRITE_REDIRECT_HANDLER_NAME)) {
         return DECLINED;
     }
@@ -5285,6 +5287,12 @@
         return DECLINED;
     }

+    vary_headers = apr_table_get(r->headers_out, "Vary");
+
+    if(vary_headers) {
+        apr_table_setn(r->err_headers_out, "Vary", vary_headers);
+    }
+
     /* now do the internal redirect */
     ap_internal_redirect(apr_pstrcat(r->pool, r->filename+9,
                                      r->args ? "?" : NULL, r->args, NULL), r);

Will do more tests (and probably improve the code) but it seems really
promising! Thanks!

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #11 from Luca Toscano <to...@gmail.com> ---
(In reply to Luca Toscano from comment #10)
> While writing tests I discovered that the above configuration does not
> trigger the issue when embedded in a Directory block (with proper stripping
> of starting "/" that don't match) because afaics an internal rewrite happens
> that clears out the outstanding Vary values.

This seems to be a long standing issue already reported by others, and
essentially due to the ap_redirect_internal function not carrying any output
headers already set in the "pre-ap_redirect_internal" request. The following
patch seems to work fine with RewriteConds in Directory context:

Index: modules/http/http_request.c
===================================================================
--- modules/http/http_request.c (revision 1809976)
+++ modules/http/http_request.c (working copy)
@@ -523,6 +523,7 @@
                                                request_rec *r) {
     int access_status;
     request_rec *new;
+    const char *vary_headers;

     if (ap_is_recursion_limit_exceeded(r)) {
         ap_die(HTTP_INTERNAL_SERVER_ERROR, r);
@@ -581,6 +582,12 @@
     new->headers_in      = r->headers_in;
     new->trailers_in     = r->trailers_in;
     new->headers_out     = apr_table_make(r->pool, 12);
+
+    vary_headers = apr_table_get(r->headers_out, "Vary");
+    if(vary_headers) {
+        apr_table_setn(new->headers_out, "Vary", vary_headers);
+    }
+
     if (ap_is_HTTP_REDIRECT(new->status)) {
         const char *location = apr_table_get(r->headers_out, "Location");
         if (location)

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #19 from Rainer Canavan <ra...@7val.com> ---
> 2) force error responses after ap_internal_redirect to carry those headers (like the vary ones).

I'm not sure if I understand that correctly, but I'd expect error responses to
come with a  Vary-Header, if any request header was evaluated to arrive at that
error. After all, 404 and friends are cacheable by default.

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #21 from Luca Toscano <to...@gmail.com> ---
A simpler variant of the patch:

Index: modules/http/http_request.c
===================================================================
--- modules/http/http_request.c (revision 1811460)
+++ modules/http/http_request.c (working copy)
@@ -523,6 +523,7 @@
                                                request_rec *r) {
     int access_status;
     request_rec *new;
+    const char *vary_header = NULL;

     if (ap_is_recursion_limit_exceeded(r)) {
         ap_die(HTTP_INTERNAL_SERVER_ERROR, r);
@@ -586,6 +587,13 @@
         if (location)
             apr_table_setn(new->headers_out, "Location", location);
     }
+
+    if (apr_table_get(r->notes, "keep-vary-header")) {
+        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: modules/mappers/mod_rewrite.c
===================================================================
--- modules/mappers/mod_rewrite.c       (revision 1811460)
+++ modules/mappers/mod_rewrite.c       (working copy)
@@ -5226,6 +5226,8 @@
                 }
             }

+            apr_table_setn(r->notes, "keep-vary-header", "");
+
             /* now initiate the internal redirect */
             rewritelog((r, 1, dconf->directory, "internal redirect with %s "
                         "[INTERNAL REDIRECT]", r->filename));

This one uses 'notes' rather than 'subprocess_env' and it is simpler. All my
tests passes, will ask some feedback to other devs about the best way to
proceed.

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #15 from Yann Ylavic <yl...@gmail.com> ---
Maybe using err_headers_out (instead of headers_out) to set Vary in the first
place?

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #23 from Luca Toscano <to...@gmail.com> ---
Updated tests in r1812542 with the new code for the directory context, will
propose a backport later on during the week.

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #14 from Luca Toscano <to...@gmail.com> ---
I tried some quick tests but it seems that when mod_rewrite hands over the
request to ap_internal_redirect then it is not going to be able to add Vary
headers anymore. It would be great to have a way to instruct the
ap_internal_redirect that some response headers needs to be "forwarded" to the
new response..

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #24 from Luca Toscano <to...@gmail.com> ---
Backport committed in r1815100.

I don't see more actionable for this task, closing it, thanks everybody for the
help! And please re-open if I am missing something :)

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #3 from Eric Covener <co...@gmail.com> ---
(In reply to Rainer Canavan from comment #0)
> A RewriteCond that evaluates %{HTTP_HOST} automatically adds "Host" to the
> Vary-Header. This is unnecessary and not permitted according to
> https://tools.ietf.org/html/rfc7231#section-7.1.4


Can you quote the "not permitted" part? Is there any practical harm in
your scenario?

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #17 from Luca Toscano <to...@gmail.com> ---
This solution has a drawback, namely that even the error responses will get the
Vary header. I tested a simple RewriteRule configured to lead to a 404, and it
gets the Vary header (that is expected using err_output_headers from what I can
read..)

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #6 from Luca Toscano <to...@gmail.com> ---
From mod_rewrite.c in httpd-trunk I can see the following:

/*
 * lookup a HTTP header and set VARY note
 */
static const char *lookup_header(const char *name, rewrite_ctx *ctx)
{
    const char *val = apr_table_get(ctx->r->headers_in, name);

    if (val) {
        ctx->vary_this = ctx->vary_this
                         ? apr_pstrcat(ctx->r->pool, ctx->vary_this, ", ",
                                       name, NULL)
                         : apr_pstrdup(ctx->r->pool, name);
    }

    return val;
}


So it seems to be done on purpose but I didn't find anything useful in the svn
commit log. Will spend a bit of time during the next days and report if I find
anything useful.

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

Rainer Canavan <ra...@7val.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
            Version|2.4.16                      |2.4.27

--- Comment #5 from Rainer Canavan <ra...@7val.com> ---
I've also tested this with 2.4.27 and it also adds "Host" to the Vary Header.

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #20 from Luca Toscano <to...@gmail.com> ---
(In reply to Rainer Canavan from comment #19)
> > 2) force error responses after ap_internal_redirect to carry those headers (like the vary ones).
> 
> I'm not sure if I understand that correctly, but I'd expect error responses
> to come with a  Vary-Header, if any request header was evaluated to arrive
> at that error. After all, 404 and friends are cacheable by default.

Sure but probably not a 50X, 404 might be borderline but afaict the current
behavior for mod_rewrite (adding automatically Vary headers when needed) is not
to add Vary headers in any error response, so I'd be inclined to keep this
behavior.

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #22 from Luca Toscano <to...@gmail.com> ---
Fix proposal for trunk committed with r1811744

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #13 from Luca Toscano <to...@gmail.com> ---
(In reply to Eric Covener from comment #12)
> Doesn't look so safe as a behavior change. It's probably sensible in this
> scenario but I could see this breaking people.  Could rewrite add the varies
> after the internal redirect?

Thanks for the feedback Eric, I have the same feeling. Going to test other way
to make this change :)

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #1 from Howard H. <bl...@gmail.com> ---
This still happens in 2.4.20, is there a fix or proposed fix?

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #18 from Luca Toscano <to...@gmail.com> ---
Another solution that I played with (just a hack, nothing complete) is the
following:

Index: modules/http/http_request.c
===================================================================
--- modules/http/http_request.c (revision 1810323)
+++ modules/http/http_request.c (working copy)
@@ -523,6 +523,8 @@
                                                request_rec *r) {
     int access_status;
     request_rec *new;
+    const char *header_to_copy = NULL;
+    const char *header_values_to_copy = NULL;

     if (ap_is_recursion_limit_exceeded(r)) {
         ap_die(HTTP_INTERNAL_SERVER_ERROR, r);
@@ -586,6 +588,13 @@
         if (location)
             apr_table_setn(new->headers_out, "Location", location);
     }
+
+    if ((header_to_copy = apr_table_get(r->subprocess_env,
"keep-response-header"))) {
+        if((header_values_to_copy = apr_table_get(r->headers_out,
header_to_copy))) {
+            apr_table_setn(new->headers_out, header_to_copy,
header_values_to_copy);
+        }
+    }
+
     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: modules/mappers/mod_rewrite.c
===================================================================
--- modules/mappers/mod_rewrite.c       (revision 1810323)
+++ modules/mappers/mod_rewrite.c       (working copy)
@@ -5285,6 +5285,8 @@
         return DECLINED;
     }

+    apr_table_setn(r->subprocess_env, "keep-response-header", "Vary");
+
     /* now do the internal redirect */
     ap_internal_redirect(apr_pstrcat(r->pool, r->filename+9,
                                      r->args ? "?" : NULL, r->args, NULL), r);


This allows to selectively merge some headers from r->headers_out to the new
request, without:
1) impacting existing code using the ap_internal_redirect since only
mod_rewrite would use it.
2) force error responses after ap_internal_redirect to carry those headers
(like the vary ones).

Not sure if it makes any sense, but I am running out of ideas :)

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #4 from Rainer Canavan <ra...@7val.com> ---
> Can you quote the "not permitted" part? 

I would interpret the very first sentence as implying that the host header is
at least not expected to be listed in Vary:

> The "Vary" header field in a response describes what parts of a request message, aside from the method, Host header field, and request target, might influence [...]


> Is there any practical harm in your scenario?

It's been a while, so I can't recall the details, but we've encountered at
least one proxy or client that refused to cache responses if "Host" was listen
in the Vary Header.

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #12 from Eric Covener <co...@gmail.com> ---
(In reply to Luca Toscano from comment #11)
> (In reply to Luca Toscano from comment #10)
> > While writing tests I discovered that the above configuration does not
> > trigger the issue when embedded in a Directory block (with proper stripping
> > of starting "/" that don't match) because afaics an internal rewrite happens
> > that clears out the outstanding Vary values.
> 
> This seems to be a long standing issue already reported by others, and
> essentially due to the ap_redirect_internal function not carrying any output
> headers already set in the "pre-ap_redirect_internal" request. The following
> patch seems to work fine with RewriteConds in Directory context:
> 
> Index: modules/http/http_request.c
> ===================================================================
> --- modules/http/http_request.c	(revision 1809976)
> +++ modules/http/http_request.c	(working copy)
> @@ -523,6 +523,7 @@
>                                                 request_rec *r) {
>      int access_status;
>      request_rec *new;
> +    const char *vary_headers;
> 
>      if (ap_is_recursion_limit_exceeded(r)) {
>          ap_die(HTTP_INTERNAL_SERVER_ERROR, r);
> @@ -581,6 +582,12 @@
>      new->headers_in      = r->headers_in;
>      new->trailers_in     = r->trailers_in;
>      new->headers_out     = apr_table_make(r->pool, 12);
> +
> +    vary_headers = apr_table_get(r->headers_out, "Vary");
> +    if(vary_headers) {
> +        apr_table_setn(new->headers_out, "Vary", vary_headers);
> +    }
> +
>      if (ap_is_HTTP_REDIRECT(new->status)) {
>          const char *location = apr_table_get(r->headers_out, "Location");
>          if (location)

Doesn't look so safe as a behavior change. It's probably sensible in this
scenario but I could see this breaking people.  Could rewrite add the varies
after the internal redirect?

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #2 from Rainer Canavan <ra...@7val.com> ---
Simplified Reproducer:

    RewriteCond %{HTTP_HOST} !whatever
    RewriteRule ^/a /b

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


[Bug 58231] RewriteCond can add "Host" to the Vary-Header

Posted by bu...@apache.org.
https://bz.apache.org/bugzilla/show_bug.cgi?id=58231

--- Comment #10 from Luca Toscano <to...@gmail.com> ---
(In reply to Rainer Canavan from comment #2)
> Simplified Reproducer:
> 
>     RewriteCond %{HTTP_HOST} !whatever
>     RewriteRule ^/a /b

While writing tests I discovered that the above configuration does not trigger
the issue when embedded in a Directory block (with proper stripping of starting
"/" that don't match) because afaics an internal rewrite happens that clears
out the outstanding Vary values.

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org