122

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>
Hennes
  • 64,768
  • 7
  • 111
  • 168
luca
  • 1,733
  • 2
  • 17
  • 23

4 Answers4

80

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)

Mikel
  • 8,846
  • 1
  • 41
  • 37
  • look at my config file above... it doesn't work yet... – luca Feb 10 '11 at 22:12
  • can it be a problem of permissions? I'm root user, I know it's not a good thing to use a system as root, anyway.. I'm root and the directory I symlink to is in the root home /root/mydir.. – luca Feb 10 '11 at 22:13
  • 2
    Yes. What error message do you see? You will need to do `sudo chmod ugo+x /root; sudo chmod ugo+rx /root/mydir` to make it work, and that's probably not a good idea. Better to move the files somewhere under `/var/www` if you can. – Mikel Feb 10 '11 at 23:17
  • Whenever you get an error and are asking for help, you should provide the exact error message to us. And there will be clues in `/var/log/apache2/error.log`. – Mikel Feb 10 '11 at 23:19
  • sorry I didn't provide error log since it was pretty useless, it said only can't access directory because can't follow symlinks OR because don't have the rights.. So it didn't provide clues, I thought... I'll see if I can fix the permissions, or I'll just move the files.. – luca Feb 11 '11 at 12:02
  • 7
    Make sure you are not pointing to your home directory when you have it encrypted, i.e. a symbolic link in `/var/www` → `/home/user/directory`. It will produce a huge headache. –  Sep 13 '11 at 14:50
  • +1 finally a person knows how-to explain configuration changes in understandable manner ... – Yordan Georgiev Aug 19 '14 at 08:05
  • See also https://stackoverflow.com/questions/7381371/apache-wont-follow-symlinks-403-forbidden – rogerdpack May 02 '18 at 03:54
  • Apache 2.4.48 - I found www-data needed access to all parts of the path. `chmod 755 /home/user` cured it for me but I would not recommend that on a public-facing machine - – MortimerCat Dec 26 '21 at 05:57
14

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.

u1686_grawity
  • 426,297
  • 64
  • 894
  • 966
  • 1
    In the case of FollowSymLinks specifically it MUST be inside a Directory structure when within a .conf file. From the Apache current manual "The FollowSymLinks and SymLinksIfOwnerMatch Options work only in sections or .htaccess files." – ClearCrescendo Jun 14 '14 at 19:07
  • 2
    Warning: Mixing Options with a + or - with those without is not valid syntax and is likely to cause unexpected results. – kurdtpage Dec 05 '17 at 00:51
14

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 https://stackoverflow.com/a/14623574

victe
  • 251
  • 2
  • 3
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.

  • `mod_autoindex` is for generating directory indexes automatically. OP question is about symlinks functionality, which is enabled by `Options +FollowSymLinks`, as explained above. – arieltools Jun 09 '23 at 22:27