How do I get Apache to follow symlinks?

In my apache www folder (/var/www on ubuntu 10.10) I have:

mydir -> /home/user/mydir

(that I created with ln -s)

Now, if I want to see a listing of the files in mydir from the web, I have to give apache the directive FollowSymLinks, right?

But where do I put it? In a .htaccess file? Where? I tried many ways but I don't understand it...

This is my /etc/apache2/sites-enabled/000-default file:

<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www <Directory /> Options FollowSymLinks Indexes AllowOverride None </Directory> <Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory> Alias /downloads/ "/root/mydir/" <Directory "/root/mydir"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>
</VirtualHost>
1

4 Answers

There are two things here:

  1. symlinks
  2. directory listing

symlinks

Assuming /var/www is your DocumentRoot for your default virtual host, you should find your default virtual host configuration file (probably /etc/apache2/sites-enabled/000-default) and put it inside that virtual host block, e.g.

<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www <Directory /> Options FollowSymLinks AllowOverride None </Directory>

If you haven't changed anything, that option should already be there.

directory listing

To make Apache list the files in a directory, you need to enable the Indexes option too, e.g. change

 <Directory /> Options FollowSymLinks AllowOverride None </Directory>

in /etc/apache2/sites-enabled/000-default to:

 <Directory /> Options FollowSymLinks Indexes AllowOverride None </Directory>

Or, perhaps a more secure way is to change it to:

 <Directory /> Options FollowSymLinks AllowOverride Indexes </Directory>

and put this in /home/user/mydir/.htaccess.

 Option Indexes

why .htaccess doesn't work

By default, putting Options <something> in an .htaccess file won't work because of the other entry in your config file: AllowOverride None.

That's why we have to put AllowOverride Indexes there.

(AllowOverride documentation)

9

With the original (fresh) configuration on Ubuntu 14.04 with apache 2.4.7, there is no need to change anything in *.conf to follow symlinks created under /var/www/html.

But it is necessary that user www-data has access to ALL the path of symlink target (even for virtualhosts not only for simlinks). For instance,

cd /var/www/html
ln -s /path/to/mirror/cran-mirror cran

In this example user www-data (or all users if you want, but can be dangerous) needs execute rights all the way to the directory. Need x rights in each of /path, /path/to, and /path/to/mirror. Also needs Read permission on the target directory, and, depending of the goal of the directory, maybe user www-data needs write permissions too.

Clue was obtained from

The option must be used like this:

Options +FollowSymLinks

Usually it's put in Apache configuration (httpd.conf or conf.d/ or sites-enabled/) inside a <Directory>.

See Options, AllowOverride and <Directory> in Apache documentation.

2

I couldn't get this working until installing the autoindex apache module. Out of numerous blog posts and forum posts, no one mentioned it being necessary. Hope this helps someone.

You Might Also Like