Hello,
In both Apache 2.2 and 2.4, I get strange behavior with <Location /foo>
directive and requested URL http://example.com/foo/non-existing.
Say my configuration is:
<VirtualHost *:80>
DocumentRoot "/var/www/apache.test"
ServerName apache.test
<Directory "/var/www/apache.test">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
# Catch non-existing resources with index.php:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [L]
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}/index.php [L]
</Directory>
<Location "/">
Header set X-All "true"
</Location>
<Location "/foo">
Header set X-Foo "true"
</Location>
</VirtualHost>
and DocumentRoot directory "/var/www/apache.test" has following content:
/var/www/apache.test
├── bar
│ └── baz
├── foo
│ └── qux
└── index.php
/foo directory physically exists in DocumentRoot and
directory /foo/non-existing does not.
Testing various URLs using:
curl -D - http://apache.test/ -o /dev/null -s | grep -F "X-"
I get the following results:
URL | X-All? | X-Foo?
-----------------------|--------|-------
/ | X |
/bar/ | X |
/bar/baz/ | X |
/bar/non-existing/ | X |
/non-existing/ | X |
/foo/ | X | X
/foo/qux/ | X | X
/foo/non-existing/ | X |
/foo/qux/non-existing/ | X |
I thought <Location "/foo"> would add an header for any request to
http://apache.test/foo/*.
I get <Directory> is for file system items and <Location> is for dynamic
URLs. So I also tried using both <Directory> and <Location> to cover all
cases:
<VirtualHost *:80>
DocumentRoot "/var/www/apache.test"
ServerName apache.test
<Directory "/var/www/apache.test">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
# Catch non-existing resources with index.php:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [L]
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}/index.php [L]
Header set X-AllDir "true"
</Directory>
<Location "/">
Header set X-AllLoc "true"
</Location>
<Directory "/var/www/apache.test/foo">
Header set X-FooDir "true"
</Location>
<Location "/foo">
Header set X-FooLoc "true"
</Location>
</VirtualHost>
I get the following results:
URL | X-AllDir? | X-AllLoc? | X-FooDir? | X-FooLoc?
-----------------------|-----------|-----------|-----------|----------
/ | X | X | |
/bar/ | X | X | |
/bar/baz/ | X | X | |
/bar/non-existing/ | X | X | |
/non-existing/ | X | X | |
/foo/ | X | X | X | X
/foo/qux/ | X | X | X | X
/foo/non-existing/ | X | X | |
/foo/qux/non-existing/ | X | X | |
I also tried only having a <Location> dedicated to "/foo/non-existing/":
<VirtualHost *:80>
DocumentRoot "/var/www/apache.test"
ServerName apache.test
<Directory "/var/www/apache.test">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
# Catch non-existing resources with index.php:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [L]
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}/index.php [L]
</Directory>
<Location "/foo/non-existing">
Header set X-FooNonExisting "true"
</Location>
</VirtualHost>
But http://apache.test/foo/non-existing still won't return the
X-FooNonExisting header.
The way I see it, Apache somehow fails to match requests to
/foo/non-existing/ because asked asset is both for a existing directory
("/foo") and a virtual-subdir ("non-existing").
My ultimate goal is to set a given header in all the HTTP responses but
the ones answering requests to:
http://example.com/foo/qux/non-existing/*.
--
DUVERGIER Claude
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]