** Description changed:

  [Test Case]
  
  Setup
  Apache 2.4.7
  * mod_rewrite
  * mod_ajp
  * mod_dir
  
  Tomcat
  * Listening on Port 9001
  
  Apache with a .htaccess in the example.net VirtualHost
  
-   RewriteEngine On
-   RewriteRule ^(.*)$ ajp://localhost:9001/$1 [P]
- 
+   RewriteEngine On
+   RewriteRule ^(.*)$ ajp://localhost:9001/$1 [P]
  
  Expected:
  Return from Tomcat
  
-   HTTP Status 404 - /
+   HTTP Status 404 - /
  
  Reality:
  Return from Tomcat
  
-   HTTP Status 404 - /index.html
+   HTTP Status 404 - /index.html
  
- 
- Workaround for this particular setup was to either disable mod_dir or disable 
DirectoryIndex in .htaccess.
+ Workaround for this particular setup was to either disable mod_dir or
+ disable DirectoryIndex in .htaccess.
  
  Or on VirtualHost context use ProxyPass.
  
-   ProxyPass / ajp://localhost:9001/
-   ProxyPassReverse / ajp://localhost:9001/
- 
+   ProxyPass / ajp://localhost:9001/
+   ProxyPassReverse / ajp://localhost:9001/
  
  [Impact]
  
  With DirectoryIndex disabled:
  <pre>
- [Thu Apr 30 13:55:18.761066 2015] [rewrite:trace3] [pid 31422] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38052] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb50a0/initial] [perdir 
/home/www-data/example.net/] strip per-dir prefix: /home/www-data/example.net/ 
-> 
+ [Thu Apr 30 13:55:18.761066 2015] [rewrite:trace3] [pid 31422] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38052] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb50a0/initial] [perdir 
/home/www-data/example.net/] strip per-dir prefix: /home/www-data/example.net/ 
->
  [Thu Apr 30 13:55:18.761191 2015] [rewrite:trace3] [pid 31422] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38052] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb50a0/initial] [perdir 
/home/www-data/example.net/] applying pattern '^(.*)$' to uri ''
  [Thu Apr 30 13:55:18.761215 2015] [rewrite:trace2] [pid 31422] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38052] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb50a0/initial] [perdir 
/home/www-data/example.net/] rewrite '' -> 'ajp://localhost:9001/'
  [Thu Apr 30 13:55:18.761232 2015] [rewrite:trace2] [pid 31422] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38052] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb50a0/initial] [perdir 
/home/www-data/example.net/] escaped URI in per-dir context for proxy, 
ajp://localhost:9001/ -> ajp://localhost:9001/
  [Thu Apr 30 13:55:18.761245 2015] [rewrite:trace2] [pid 31422] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38052] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb50a0/initial] [perdir 
/home/www-data/example.net/] forcing proxy-throughput with ajp://localhost:9001/
  [Thu Apr 30 13:55:18.761259 2015] [rewrite:trace1] [pid 31422] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38052] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb50a0/initial] [perdir 
/home/www-data/example.net/] go-ahead with proxy request 
proxy:ajp://localhost:9001/ [OK]
  </pre>
  
  With DirectoryIndex enabled:
  <pre>
- [Thu Apr 30 13:58:37.954876 2015] [rewrite:trace3] [pid 31419] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38156] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb10a0/initial] [perdir 
/home/www-data/example.net/] strip per-dir prefix: /home/www-data/example.net/ 
-> 
+ [Thu Apr 30 13:58:37.954876 2015] [rewrite:trace3] [pid 31419] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38156] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb10a0/initial] [perdir 
/home/www-data/example.net/] strip per-dir prefix: /home/www-data/example.net/ 
->
  [Thu Apr 30 13:58:37.954930 2015] [rewrite:trace3] [pid 31419] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38156] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb10a0/initial] [perdir 
/home/www-data/example.net/] applying pattern '^(.*)$' to uri ''
  [Thu Apr 30 13:58:37.954947 2015] [rewrite:trace2] [pid 31419] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38156] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb10a0/initial] [perdir 
/home/www-data/example.net/] rewrite '' -> 'ajp://localhost:9001/'
  [Thu Apr 30 13:58:37.954959 2015] [rewrite:trace2] [pid 31419] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38156] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb10a0/initial] [perdir 
/home/www-data/example.net/] escaped URI in per-dir context for proxy, 
ajp://localhost:9001/ -> ajp://localhost:9001/
  [Thu Apr 30 13:58:37.954968 2015] [rewrite:trace2] [pid 31419] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38156] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb10a0/initial] [perdir 
/home/www-data/example.net/] forcing proxy-throughput with ajp://localhost:9001/
  [Thu Apr 30 13:58:37.954977 2015] [rewrite:trace1] [pid 31419] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38156] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb10a0/initial] [perdir 
/home/www-data/example.net/] go-ahead with proxy request 
proxy:ajp://localhost:9001/ [OK]
  [Thu Apr 30 13:58:37.955023 2015] [rewrite:trace3] [pid 31419] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38156] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb30a0/subreq] [perdir 
/home/www-data/example.net/] strip per-dir prefix: 
/home/www-data/example.net/index.html -> index.html
  [Thu Apr 30 13:58:37.955036 2015] [rewrite:trace3] [pid 31419] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38156] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb30a0/subreq] [perdir 
/home/www-data/example.net/] applying pattern '^(.*)$' to uri 'index.html'
  [Thu Apr 30 13:58:37.955076 2015] [rewrite:trace2] [pid 31419] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38156] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb30a0/subreq] [perdir 
/home/www-data/example.net/] rewrite 'index.html' -> 
'ajp://localhost:9001/index.html'
  [Thu Apr 30 13:58:37.955086 2015] [rewrite:trace2] [pid 31419] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38156] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb30a0/subreq] [perdir 
/home/www-data/example.net/] escaped URI in per-dir context for proxy, 
ajp://localhost:9001/index.html -> ajp://localhost:9001/index.html
  [Thu Apr 30 13:58:37.955094 2015] [rewrite:trace2] [pid 31419] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38156] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb30a0/subreq] [perdir 
/home/www-data/example.net/] forcing proxy-throughput with 
ajp://localhost:9001/index.html
  [Thu Apr 30 13:58:37.955103 2015] [rewrite:trace1] [pid 31419] 
mod_rewrite.c(468): [client XXX.XXX.XXX.XXX:38156] XXX.XXX.XXX.XXX - - 
[example.net/sid#7fc6ddd849f8][rid#7fc6ddcb30a0/subreq] [perdir 
/home/www-data/example.net/] go-ahead with proxy request 
proxy:ajp://localhost:9001/index.html [OK]
  </pre>
  
- 
  [Regression Potential]
  
  As stated on the apache bugtracker
  https://bz.apache.org/bugzilla/show_bug.cgi?id=53929#c10:
  
  "The behavior now seems to be consistent with 2.2, and a rewrite rule
  that conflicts with a DirectoryIndex gets applied."
+ 
+ The default value of the new configuration option does change behaviour
+ so there is a chance that this could be undesirable for some users.
+ However, this is a very small chance, as the current default behaviour
+ is only present in apache versions between 2.4 and 2.4.8 when the fix
+ was introduced upstream. Behaviour can be kept consistent with current
+ behaviour by setting "DirectoryCheckHandler On".
  
  [Original Description]
  Ubuntu 14.04LTS x86_64
  
  In apache 2.4.7 there is a bug in mod_dir, in that it does not stop when
  the URL has just been rewritten by mod_rewrite.
  
  If you have rewrite rules in .htaccess, ending in a [P] for an external
  URL, rule execution should stop and mod_proxy should go and fetch the
  given URL. Instead, mod_dir fires another round of rewrite rule checks
  as it looks for .../index.html, possibly giving completely different
  results (e.g. not fetching from remote site).
  
  http://www.apachelounge.com/Changelog-2.4.html:
  
    ...
    *) mod_dir: Don't search for a DirectoryIndex or DirectorySlash on a
       URL that was just rewritten by mod_rewrite. PR53929. [Eric Covener]
    ...
  
  http://stackoverflow.com/questions/17095981/why-apache-mod-rewrite-
  rewrites-twice-my-url
  
  Please backport the for PR53929
  (or update apache package to 2.4.9)

-- 
You received this bug notification because you are a member of Ubuntu
Server Team, which is subscribed to the bug report.
https://bugs.launchpad.net/bugs/1394403

Title:
  RewriteRule of "^$" is broken

To manage notifications about this bug go to:
https://bugs.launchpad.net/apache2/+bug/1394403/+subscriptions

-- 
Ubuntu-server-bugs mailing list
Ubuntu-server-bugs@lists.ubuntu.com
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/ubuntu-server-bugs

Reply via email to