Symfony 4 - route : "The requested URL was not found on this server"
Asked Answered
B

3

10

this is my first post so i'll try to be understandable.

I am starting with symfony, and there is a problem i can't resolve alone.

This is my controller, and I am working with WAMP. When my Url is "mysite.local", it work normally, and it show me what it should (thanks to the home() function). But when my Url is "mysite.local/hello", i have the following error.

Not Found

The requested URL was not found on this server.

Apache/2.4.41 (Win64) PHP/7.4.0 Server at mysite.local Port 80

I guess this is normal as i didn't created any file named "hello", but it's working in the formation i am following.

Could you help me please ? Thank you

<?php


namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class HomeController extends AbstractController
{
/**
 * @Route("/hello", name="hello")
 */

public function hello()
{
    return new Response("Bonjour ...");
}
/**
 *@Route("/", name="homepage");
 */

public function home(){
    $prenoms = ["Lior" => 17 , "Joseph" => 12, "Anne" => 55];
    return $this->render("home.html.twig",
        [
            'title' => "Bonjour a tous :)",
            'age' => "31 ",
            'tableau' => $prenoms,
        ]); 
}

}

?>

Bertram answered 5/3, 2020 at 3:27 Comment(2)
Hello there. Do you have the route defined for hello? Normally in MVC frameworks the route calls the controller's function. If mysite.local works that is because route / is mapped to home() function of the controller. The error message suggests that /hello does not exist. Please checkDereism
@kendrick where is your routes definition code?Schlegel
B
29

Please try with

mysite.local/index.php/hello

If that works, that means either .htaccess file is missing or mod_rewrite is not enabled on apache server.

first you can run

composer require symfony/apache-pack

to add .htaccess automatically and test, if route works then everything is fine.

otherwise you've to edit httpd.conf or apache2.conf file and enable mod_rewrite

Baltimore answered 5/3, 2020 at 6:36 Comment(6)
hello, Thank you for your answer : this URL (mysite.local/index.php/hello) works. But where should i run the command ? In the C:/wamp64 file, or directly in C:/wamp64/www/mysite ?Bertram
run the command in project directory i.e. C:/wamp64/www/mysiteBaltimore
@KendrickLarlar Also you've to run this command composer require symfony/apache-pack, I've updated my answer as well.Baltimore
@KendrickLarlar Kindly mark my answer as correct if it worked for you. Thanks :)Baltimore
Thanks, it's worksPascia
You saved my day Sir! I also want to add that for me this issue caused by wrong virtual host file setup and configuration. For the same directive config if I put it here /etc/httpd/conf.d/ssl.conf - it will work and if I put it here /etc/httpd/conf.d/custom.conf - it will not work . As you can see that is because ssl.conf overridden the custom.conf - not what I expected.Doering
S
4

apache is missing on you server to add .htaccess file

composer require symfony/apache-pack
Suffocate answered 5/3, 2020 at 16:22 Comment(1)
Besides this, make sure you have a2enmod rewrite apache rewrite mod on (you can just run it on local or in apache container and it will say if it's already enabled or not).Tampere
A
1

Need to create .htaccess file with composer above way, but the symfony/apache-pack by default will not execute, you need to put y

or create .htaccess file manually by copying the below content inside public folder, where index.php file lives, then all routes will work.

# Use the front controller as index file. It serves as a fallback solution when
# every other rewrite/redirect fails (e.g. in an aliased environment without
# mod_rewrite). Additionally, this reduces the matching process for the
# start page (path "/") because otherwise Apache will apply the rewriting rules
# to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl).
DirectoryIndex index.php

# By default, Apache does not evaluate symbolic links if you did not enable this
# feature in your server configuration. Uncomment the following line if you
# install assets as symlinks or if you experience problems related to symlinks
# when compiling LESS/Sass/CoffeScript assets.
# Options +FollowSymlinks

# Disabling MultiViews prevents unwanted negotiation, e.g. "/index" should not resolve
# to the front controller "/index.php" but be rewritten to "/index.php/index".
<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Determine the RewriteBase automatically and set it as environment variable.
    # If you are using Apache aliases to do mass virtual hosting or installed the
    # project in a subdirectory, the base path will be prepended to allow proper
    # resolution of the index.php file and to redirect to the correct URI. It will
    # work in environments without path prefix as well, providing a safe, one-size
    # fits all solution. But as you do not need it in this case, you can comment
    # the following 2 lines to eliminate the overhead.
    RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.*)::\2$
    RewriteRule .* - [E=BASE:%1]

    # Sets the HTTP_AUTHORIZATION header removed by Apache
    RewriteCond %{HTTP:Authorization} .+
    RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0]

    # Redirect to URI without front controller to prevent duplicate content
    # (with and without `/index.php`). Only do this redirect on the initial
    # rewrite by Apache and not on subsequent cycles. Otherwise we would get an
    # endless redirect loop (request -> rewrite to front controller ->
    # redirect -> request -> ...).
    # So in case you get a "too many redirects" error or you always get redirected
    # to the start page because your Apache does not expose the REDIRECT_STATUS
    # environment variable, you have 2 choices:
    # - disable this feature by commenting the following 2 lines or
    # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the
    #   following RewriteCond (best solution)
    RewriteCond %{ENV:REDIRECT_STATUS} =""
    RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]

    # If the requested filename exists, simply serve it.
    # We only want to let Apache serve files and not directories.
    # Rewrite all other queries to the front controller.
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ %{ENV:BASE}/index.php [L]
</IfModule>

<IfModule !mod_rewrite.c>
    <IfModule mod_alias.c>
        # When mod_rewrite is not available, we instruct a temporary redirect of
        # the start page to the front controller explicitly so that the website
        # and the generated links can still be used.
        RedirectMatch 307 ^/$ /index.php/
        # RedirectTemp cannot be used instead
    </IfModule>
</IfModule>

Aeri answered 30/11, 2022 at 22:6 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.