On Tue, Jul 24, 2012 at 12:28 AM, Glen Birnie <glen.bir...@bbc.co.uk> wrote:

> We have seen an issue in httpd 2.2.21 where mod_cache incorrectly returns
> HTTP 200 responses instead of HTTP 404 where:
>
> - Reverse proxying is configured.
> - ProxyErrorOverride is set to On.
> - mod_disk_cache is set up to cache content proxied from mod_proxy.
> - A local ErrorDocument 404 URL is configured.
> - The error document URL is requested and the contents cached by
> mod_disk_cache.
> - A nonexistent URL is routed to the proxy destination, the destination
> proxy returns a 404, but mod_cache returns the configured ErrorDocument
> content with an incorrect 200 response.
>
> We have done some searching of the list archives and bug database but have
> not seen reports of any similar problems.
>
> ---
>
> Steps to reproduce:
>
> - Create an error image and write to the document root (we assume URI
> /error.jpg in the examples below).
>
> - Setup a mod_disk_cache directory (we assume
> /data/httpcache/httpd/cache-root) with the necessary permissions.
>
> - Use configuration akin to the following (set "proxy.destination" /
> "web.proxy" as appropriate):
>
> <IfModule !mod_cache.c>
> LoadModule cache_module modules/mod_cache.so
> </IfModule>
>
> <IfModule !mod_disk_cache.c>
> LoadModule disk_cache_module modules/mod_disk_cache.so
> </IfModule>
>
> <IfModule !mod_rewrite.c>
> LoadModule rewrite_module modules/mod_rewrite.so
> </IfModule>
>
> <IfModule !mod_proxy.c>
> LoadModule proxy_module modules/mod_proxy.so
> </IfModule>
>
> <IfModule mod_cache.c>
>   <IfModule mod_disk_cache.c>
>     CacheRoot /data/httpcache/httpd/cache-root
>     CacheDirLevels 3
>     CacheDirLength 1
>     CacheMinFileSize 0
>     CacheMaxFileSize 1000000
>   </IfModule>
> </IfModule>
>
> CacheEnable disk /
>
> ProxyErrorOverride On
> ProxyPassReverse / http://proxy.destination/
>
> # Configure this if the destination server resides behind a proxy
> #ProxyRemote http://proxy.destination/ http://web.proxy:80
>
> <Location /proxystuff/>
>   RewriteEngine On
>   RewriteRule /proxystuff/error$ /error.jpg [L]
>   RewriteRule /proxystuff/get http://proxy.destination%{REQUEST_URI} [P,L]
>
>   # This image should reside in the document root,
>   # i.e. return a HTTP 200 when requested
>   ErrorDocument 404 /error.jpg
> </Location>
>
>
> - Request the error image e.g.:
>
> curl -Lsv -H 'Pragma: ' -o /dev/null http://localhost/error.jpg
>
> This should get written into the cache:
>
> htcacheclean -a -D -p /data/httpcache/httpd/cache-root
>
>
> - Request a nonexistent proxied URL e.g.:
>
> curl -Lsv -H 'Pragma: ' -o /dev/null http://localhost/proxystuff/get
>
> An incorrect HTTP 200 response is returned instead of the expected HTTP
> 404.
> Note this does not happen if the CacheEnable directive is disabled.
>
> It appears that mod_cache is returning a cached 404 errordocument response
> and assuming that (because this exists) a 200 should be issued, rather than
> forwarding the 404 response from the destination proxy server.
>
>
> Glen
>
>
> http://www.bbc.co.uk/
> This e-mail (and any attachments) is confidential and may contain personal
> views which are not the views of the BBC unless specifically stated.
> If you have received it in error, please delete it from your system.
> Do not use, copy or disclose the information in any way nor act in
> reliance on it and notify the sender immediately.
> Please note that the BBC monitors e-mails sent or received.
> Further communication will signify your consent to this.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@httpd.apache.org
> For additional commands, e-mail: users-h...@httpd.apache.org
>
>
Use CacheDisable directive to disable caching for your custom error pages,
something like this:

CacheDisable /your_custom_err_pages

and put 404 page inside

Also according to the documentation you can use the no-cache environment
variable to disable caching on finer grained set of resources.

Igor

Reply via email to