Question

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
Was it helpful?

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top