Search code examples
phpslugsilex

Silex slugs cause 404 page not found


Following the documentation, Silex allows "slugs" to be passed in via the URL for use within your code.

The following example works:

$app = new Silex\Application();

$app->get('/', function () {
    return 'HAI';
});

However, the following gives a 404 Not Found:

$app = new Silex\Application();

$app->get('/{slug}', function ($slug) {
    return 'HAI' . $slug;
});

How can I fix this 404?

In case it's of any relevance, here's my Apache Vhost:

<VirtualHost 127.0.0.1:80>
    DocumentRoot "/var/www/Silex/web"
    DirectoryIndex index.php

    <Directory "/var/www/Silex/web">
        AllowOverride All
        Allow from All
    </Directory>
</VirtualHost>

...and my directory structure:

/src
  |-- bootstrap.php
/tests
/vendor
/web
  |-- index.php

Solution

  • It turns out that this was an Apache issue. It was assumed that you could either use a .htaccess file, or a vhost. You actually need to use both.

    .htaccess:

    FallbackResource /index.php
    

    Note: You can only use FallbackResource if using Apache 2.2.16 or higher.

    vhost

    <VirtualHost 127.0.0.1:80>
        DocumentRoot "/var/www/Silex/web"
        DirectoryIndex index.php
    
        <Directory "/var/www/Silex/web">
            AllowOverride All
            Allow from All
        </Directory>
    </VirtualHost>
    

    An alternative is to place the contents of the .htaccess file (the FallbackResource directive) within the vhost itself, and get rid of the htaccess.

    As soon as I added the .htaccess, the slug in my second example worked.