Hi again,

Sorry it's still an user issue, but I'm writing to this list to inform people 
that I have been helped. Thanks Jacob!

I did not understand that the <Directory "/path">  requires its path input to 
have the absolute path of DocumentRoot prefixed. The dir merge function from 
mod_dir and my own mod were both correctly provided with pointers that point to 
nothing, as directory mappings were not successful.

The corrected config should have been like this for the non working Case2 
stated in my original email:

                <Directory /usr/local/apache2/htdocs/>
                </Directory>
                <Directory /usr/local/apache2/htdocs/foo>
                                DirectoryIndex foo.html
                </Directory>
                <Directory /usr/local/apache2/htdocs/foo/bar>
                </Directory>

Thanks,
Jin

From: PAN, JIN
Sent: Tuesday, November 03, 2015 3:06 PM
To: dev@httpd.apache.org
Subject: Question on multiple <Directory> sections merging

Hi,

Is there anyone familiar with the Apache <Directory> section merge that can 
explain the merging behavior?

Posting this to dev, because this is not a usage issue. We are writing a custom 
module that needs to have different context from multiple <Directory> sections 
merged, so that a request made for "foo/bar" will have access to its top level 
<Directory> context, ie "foo/" and "/" as well.

We observed the following merge behavior with <Directory>, and don't understand 
what's going on...

-          The merge happens from "/" to "/dir1/dir2" if config line exists in 
"/", but NOT from "/dir1" to "/dir1/dir2" if config line exists in "/dir1".

This is problematic if everything only works if we must specify something at 
the "/" level.

-          Order of the config lines as they appear in httpd.conf does not 
matter.


I'm demonstrating this using foo.html and the version 2.4 mod_dir rather than 
my mod, in order to exclude any user coding issues. (So in other words, 
mod_dir's merge_dir_configs behaves the same as my mod). Given the file 
location below, and as in Case 1 working config below, the Directory "/" config 
defines foo.html,  and a request made for "foo/bar" properly displays the 
"htdocs/foo/bar/foo.html" page demonstrating the config merge from "/" to 
"foo/bar". However, if we move the same config line to the "/foo" section (as 
in Case2 below), then the merge does not happen, and in this case, the same 
request for "foo/bar" displays the standard directory listing, and not the 
foo.html page even though it exists in /foo/bar directory. Why?

I would like to point out that if all sections are changed to use <Location> 
instead, then the foo.html is displayed in both cases. But just having 
<Location> working the way we want is insufficient as we cannot tell our users 
to only use <Location>.

We are going by the Apache 2.4 documentation (link included below) to expect 
the config lines illustrated in both cases to merge the directory contexts. Any 
insights to the merging sequence will be greatly appreciated!

Thank you!
-Jin

Filesystem:
                % ls /usr/local/apache2/htdocs
                foo
                % ls /usr/local/apache2/htdocs/foo
                bar
                % ls /usr/local/apache2/htdocs/foo/bar
                foo.html

Case 1: Working Config:
                <Directory />
                                DirectoryIndex foo.html
                </Directory>
                <Directory /foo>
                </Directory>
                <Directory /foo/bar>
                </Directory>

Case 2: Not Working Config
                <Directory />
                </Directory>
                <Directory /foo>
                                DirectoryIndex foo.html
                </Directory>
                <Directory /foo/bar>
                </Directory>

Different behavior with <Location>, this works below
                <Location />
                </Location>
                <Location /foo>
                                DirectoryIndex foo.html
                </Location>
                <Location /foo/bar>
                </Location>

https://httpd.apache.org/docs/2.4/sections.html says the following on section 
merging
" ... <Directory "/var/web/dir"> will be processed before <Directory 
"/var/web/dir/subdir">. If multiple 
<Directory><https://httpd.apache.org/docs/2.4/mod/core.html#directory> sections 
apply to the same directory they are processed in the configuration file order. 
..."

Reply via email to