The END flag for mod_rewrite in Apache 2.4 does not appear to be working
correctly. I have a directory named test with a file test.html. I have
placed an .htaccess file in the directory with the following content

RewriteEngine on
RewriteRule ^test$ test.html [NC,QSA,END]
RewriteRule ^$ test.html  [NC,QSA,END]

Here is the rewrite log for the request http://localhost.dev/test/

[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a56d60/initial] [perdir
/var/www/vhosts/test/] strip per-dir prefix: /var/www/vhosts/test/ ->
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a56d60/initial] [perdir
/var/www/vhosts/test/] applying pattern '^test to uri ''
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a56d60/initial] [perdir
/var/www/vhosts/test/] strip per-dir prefix: /var/www/vhosts/test/ ->
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a56d60/initial] [perdir
/var/www/vhosts/test/] applying pattern '^ to uri ''
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a56d60/initial] [perdir
/var/www/vhosts/test/] rewrite '' -> 'test.html'
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a56d60/initial] [perdir
/var/www/vhosts/test/] add per-dir prefix: test.html ->
/var/www/vhosts/test/test.html
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a56d60/initial] [perdir
/var/www/vhosts/test/] strip document_root prefix:
/var/www/vhosts/test/test.html -> /test/test.html
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a56d60/initial] [perdir
/var/www/vhosts/test/] internal redirect with /test/test.html [INTERNAL
REDIRECT]
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir
/var/www/vhosts/test/] strip per-dir prefix: /var/www/vhosts/test/index.php
-> index.php
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir
/var/www/vhosts/test/] applying pattern '^test to uri 'index.php'
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir
/var/www/vhosts/test/] strip per-dir prefix: /var/www/vhosts/test/index.php
-> index.php
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir
/var/www/vhosts/test/] applying pattern '^ to uri 'index.php'
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir
/var/www/vhosts/test/] pass through /var/www/vhosts/test/index.php
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir
/var/www/vhosts/test/] strip per-dir prefix:
/var/www/vhosts/test/index.html -> index.html
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir
/var/www/vhosts/test/] applying pattern '^test to uri 'index.html'
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir
/var/www/vhosts/test/] strip per-dir prefix:
/var/www/vhosts/test/index.html -> index.html
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir
/var/www/vhosts/test/] applying pattern '^ to uri 'index.html'
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a44060/subreq] [perdir
/var/www/vhosts/test/] pass through /var/www/vhosts/test/index.html

Why is mod_rewrite making sub requests for directory index files index.html
and index.php, when the second rule matches the request? If I set a
FallbackResource directive, then the fallback file is served, instead of
the rewritten file.

Request for http://localhost.dev/test/test works without any sub request,
as expected

[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a58b20/initial] [perdir
/var/www/vhosts/test/] strip per-dir prefix: /var/www/vhosts/test/test ->
test
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a58b20/initial] [perdir
/var/www/vhosts/test/] applying pattern '^test to uri 'test'
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a58b20/initial] [perdir
/var/www/vhosts/test/] rewrite 'test' -> 'test.html'
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a58b20/initial] [perdir
/var/www/vhosts/test/] add per-dir prefix: test.html ->
/var/www/vhosts/test/test.html
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a58b20/initial] [perdir
/var/www/vhosts/test/] strip document_root prefix:
/var/www/vhosts/test/test.html -> /test/test.html
[...] 10.0.2.2 - - [localhost.dev/sid#2532c00][rid#2a58b20/initial] [perdir
/var/www/vhosts/test/] internal redirect with /test/test.html [INTERNAL
REDIRECT]

I have tried using L and END flags, independently and together.

In 2.2 it is working, even if the FallbackResource directive is set. The
problem is only in httpd 2.4. Is this a bug?

Joyce Babu

Reply via email to